MySQL-5.7 双主互备+keepalived

VIP : 192.168.56.100

Server 1 : 192.168.56.101

Server 2 : 192.168.56.102

Step 1 : 安装 MySQL(192.168.56.101)

//需删除 linux 系统自带的数据库配置文件/etc/my.cnf,否则安装过程中会默认加载此配置文件

groupadd mysql
useradd -r -g mysql -s /bin/false mysql
chown -R mysql:mysql .
bin/mysqld –initialize –user=mysql –basedir=/srv/mysql #如果安装目录不在 /url/local/mysql ,则需要使用 –basedir 指定
bin/mysql_ssl_rsa_setup –datadir=/srv/mysql/data #如果安装目录不在 /url/local/mysql ,则需要使用 –datadir 指定
chown -R root:root .
chown -R mysql:mysql data/
bin/mysqld_safe –user=mysql &
bin/mysqladmin -u root -p password #修改默认密码(注意前两步命令的输出有生成的默认密码)
cp support-files/mysql.server /etc/init.d/mysql.server
vim /etc/init.d/mysql.server #如果不是安装在 /url/local/mysql 目录,则需要编辑一下,指定 basedir 和 datadir
/etc/init.d/mysql.server stop
cp support-files/my-default.cnf my.cnf

 

vim my.cnf #添加或修改以下配置

server-id=101 # 同一集群中的 server id 不能相同,此处使用其ip末段数字
log_bin=mysql-bin
log_error=mysql-bin.err
binlog_ignore_db=mysql # 忽略同步的数据库

 

/etc/init.d/mysql.server start # 启动MySQL并执行以下SQL添加复制账号

CREATE USER ‘slave’@’192.168.56.102’ IDENTIFIED BY ‘password’;GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘slave’@’192.168.56.102’ REQUIRE NONE;

 

Step 2 : 安装 MySQL(192.168.56.102)

//重复 Step 1(将命令中的 101 替换成 102,102 替换成 101)

Step 3 : 配置主从互备

192.168.56.101 ~ MySQL 终端运行如下 SQL 查看此实例作为主库的状态

SHOW MASTER STATUS;

 

192.168.56.102 ~ MySQL 终端运行如下 SQL 配置此实例作为从库需要连接的主库信息

CHANGE MASTER TO
MASTER_HOST=’192.168.56.101′,
MASTER_USER=’slave’,
MASTER_PASSWORD=’password’,
MASTER_LOG_FILE=’mysql-bin.000003′, #这个值对应上条命令输出的 `File` 字段
MASTER_LOG_POS=154; #这个值对应上条命令输出的 `Position` 字段

 

192.168.56.102 ~ MySQL 终端运行如下 SQL 查看此实例作为主库的状态

SHOW MASTER STATUS; # 查看此实例作为主库的状态

 

192.168.56.101 ~ MySQL 终端运行如下 SQL 配置此实例作为从库需要连接的主库信息

CHANGE MASTER TO
MASTER_HOST=’192.168.56.102′,
MASTER_USER=’slave’,
MASTER_PASSWORD=’password’,
MASTER_LOG_FILE=’mysql-bin.000003′, #这个值对应上条命令输出的 `File` 字段
MASTER_LOG_POS=154; #这个值对应上条命令输出的 `Position` 字段

 

最后分别在 101 和 102 两台 MySQL 的终端执行以下命令

START SLAVE; # 启动从库复制
SHOW SLAVE STATUS; # 查看此实例作为从库的状态

 

查看上条命令的输出 Slave_IO_Running 和 Slave_SQL_Running 的值都为 Yes 则表示两台实例的互相复制进程已经可用了

以上配置是在两台数据库都是空闲的新实例中配置的 线上的实例不适用以上配置

线上的实例需要锁定数据库库以保证配置的 MASTER_LOG_FILE 和 MASTER_LOG_POS 是正确的

Step 4 : 安装 keepalived(192.168.56.101)

cd keepalived-1.2.23
./configure –prefix=/srv/keepalived && make && make install

 

vim /srv/keepalived/etc/keepalived/keepalived.conf #编辑配置文件如下

! Configuration File for keepalived
global_defs {
   router_id HA_MYSQL
}
vrrp_script chk_mysql {
    script “/etc/init.d/mysql.server status”    !定时检查MySQL状态,MySQL挂掉则将自己下线释放VIP
}
vrrp_instance VI_1 {
    state BACKUP
    interface enp0s8    !网络界面
    virtual_router_id 51
    priority 101    !权重
    advert_int 1
    nopreempt    !自己上线后不抢占当前 master 的位置,即使其权重比自己低
    virtual_ipaddress {
        192.168.56.100    !VIP
    }
    track_script {
        chk_mysql    !启用头部定义的检查MySQL状态的脚本
    }
}
virtual_server 192.168.56.100 3306 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 60
    protocol TCP    sorry_server 192.168.56.102 3306    ! real_server 挂掉后临时使用 sorry_server 顶上
    real_server 192.168.56.101 3306 {
        weight 1
        TCP_CHECK {
            connect_port    3306
            connect_timeout 3
        }
    }
}

 

Step 5 : 安装 keepalived(192.168.56.102)

重复 Step 4(将配置中的 101 替换成 102,102 替换成 101)

Step 6 : 检验配置

分别启动两台机器上的 keepalived

使用 `ip a` 命令查看哪台机器抢到了 VIP ?

停止抢到 VIP 服务器的 MySQL 实例,去另一台机器看是否接管 VIP ?

重启或关闭抢到 VIP 的 keepalived 服务,去另一台机器看是否接管 VIP ?

直接断掉抢到 VIP 的服务器的网络,去另一台机器看是否接管 VIP ?

这个架构在同一时刻只有一台 MySQL 对外提供写服务,因此不存在混写的状态,不用另外设置自增的规则。


安装 PHP 7 :

./configure --prefix=/srv/php --enable-fpm --disable-ipv6 --with-openssl --enable-bcmath --with-curl --enable-exif --with-gd --enable-gd-native-ttf --with-mhash --enable-mbstring --with-mcrypt --with-mysqli --enable-pcntl --with-pdo-mysql --enable-shmop --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-mysqlnd && make && make install

 

haproxy + keepalived

haproxy:

#tar xzf haproxy-1.5.11.tar.gz
#cd haproxy-1.5.11
#make TARGET=linux2628
#cp examples/haproxy.init /etc/init.d/haproxy
#chmod +x /etc/init.d/haproxy
#mkdir /etc/haproxy
#cp examples/haproxy.cfg /etc/haproxy/
#cp haproxy /usr/sbin/
#mkdir /usr/share/haproxy
#vim /etc/haproxy/haproxy.cfg #配置
#/etc/init.d/haproxy start

keepalived:

#tar xzf keepalived-1.2.15.tar.gz
#cd keepalived-1.2.15
#./configure && make && make install
#cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived
#cp keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived
#chmod +x /etc/init.d/keepalived
#mkdir /etc/keepalived/
#cp keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#vim /etc/keepalived/keepalived.conf #配置# state的值:主(MASTER)、备(BACKUP),priority的值:主(100)、备(99)
#ln -s /usr/local/sbin/keepalived /usr/sbin/keepalived # Starting keepalived: /bin/bash: keepalived: command not found
#/etc/init.d/keepalived start

bigbluebutton 自动安装脚本, 文档乱码

复制windows字体到bigbluebutton文档转换服务器的指定目录解决文件转化乱码问题
C:\Windows\Fonts\* -> /usr/share/fonts/windows

#!/bin/sh
#
# ubuntu-14.04.1-server-amd64
#

# Step 1: Update your server
#echo "deb http://us.archive.ubuntu.com/ubuntu/ trusty multiverse" | tee -a /etc/apt/sources.list
apt-get update
apt-get dist-upgrade

# Step 2: Install key for BigBlueButton
wget http://ubuntu.bigbluebutton.org/bigbluebutton.asc -O- | apt-key add -
echo "deb http://ubuntu.bigbluebutton.org/trusty-090/ bigbluebutton-trusty main" | tee /etc/apt/sources.list.d/bigbluebutton.list
apt-get update

# Step 3: Install ffmpeg
apt-get install build-essential git-core checkinstall yasm texi2html libvorbis-dev libx11-dev libvpx-dev libxfixes-dev zlib1g-dev pkg-config netcat
FFMPEG_VERSION=2.3.3
cd /usr/local/src
if [ ! -d "/usr/local/src/ffmpeg-${FFMPEG_VERSION}" ]; then
  wget "http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2"
  tar -xjf "ffmpeg-${FFMPEG_VERSION}.tar.bz2"
fi
cd "ffmpeg-${FFMPEG_VERSION}"
./configure --enable-version3 --enable-postproc --enable-libvorbis --enable-libvpx
make
checkinstall --pkgname=ffmpeg --pkgversion="5:${FFMPEG_VERSION}" --backup=no --deldoc=yes --default
ffmpeg -version

# Step 4: Install BigBlueButton
apt-get update
apt-get install bigbluebutton

# Step 5: Install API Demos
apt-get install bbb-demo

# Step 6: Enable WebRTC audio
bbb-conf --enablewebrtc

# Step 7: Do a Clean Restart
bbb-conf --clean
bbb-conf --check

iptables 端口转发

物理机:
Wan : xxx.xxx.xxx.xxx
Lan : 192.168.122.1

虚拟机:
Lan : 192.168.122.2

物理机 iptables :

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.122.2:22
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.122.2
iptables -t nat -A POSTROUTING -d 192.168.122.2 -p tcp -j SNAT --to-source 192.168.122.1

Nginx 试用 HTTPS

一、#openssl req -new -nodes -keyout server.key -out server.csr

二、用 server.csr 去申请 SSL 证书(免费的SSL证书服务商http://www.startssl.com)

三、将SSL证书服务商提供的密文保存至 server.crt

四、将 server.key 和 server.crt 文件上传至 nginx/conf 目录

五、配置 nginx 配置文件

a)强制从 HTTP 跳转至 HTTPS

    server {
        listen       80;
        server_name  ssl.nt00.com;
        rewrite ^/(.*)$ https://ssl.nt00.com/$1;
    }

b)配置 HTTPS

    server {
        listen       443;
        server_name  ssl.nt00.com;
        root   /www/ssl.nt00.com;

        ssl                  on;
        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
            index  index.html index.php;
        }
        location ~ \.php($|/) {
            fastcgi_pass            unix:/tmp/php-fpm.socket;
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            include                 fastcgi.conf;
        }
    }

ffmpeg flv to mp4

#!/bin/sh
list=$(ssh root@***.***.***.*** "find /home/wwwroot/r.***.com/Resources/flv/ -type f -name *.flv")
for i in $list;
do
    tmpPath=$(dirname $i)
    tmpName=$(basename $i)
    newName=${tmpName/.flv/.mp4}
    scp root@***.***.***.***:$i ./
    ffmpeg -i $tmpName $newName
    rm -f $tmpName
    scp $newName root@***.***.***.***:$tmpPath
    rm -f $newName
done

nginx 下载文件不完整

使用 nginx 搭建静态文件服务器,下载稍大的文件时出现只能下载来来文件的一部分的问题。

用 wget 可以下载完整的文件。

后来使用 strace wget http://xxx/xxx.xx 打印详细的下载log 发现:文件在传输的过程中跟nginx的连接中断了几次,wget有自动重连的机制,最后才下载下来了完整的文件,而浏览器在连接中断后则认为文件已经传输完成,以至于出现只能下载文件的一部分的情况。

后来分析可能是中间用 nginx 做了一次代理的缘故,尝试配置host直接从静态文件服务器的nginx中下载,没有出现连接中断的情况。

最后将代理 nginx 的配置文件中添加 ( proxy_buffering off; #关闭代理的缓冲功能) 配置,问题解决。

参考文献:http://blog.csdn.net/ikmb/article/details/7098080