MySQL双主互备
原理说明
热备份指的是:High Available(HA)即高可用。第一种,双机热备它的工作原理是使用两台服务器,一台作为主服务器(Active),运行应用系统来提供服务。另一台作为备机,安装完全一样的应用系统,但处于待机状态(Standby)。当Active服务器出现故障时,通过软件诊测将Standby机器激活,保证应用在短时间内完成恢复正常使用;第二种,双机互备方式则是在双机热备的基础上,两个相对独立的应用在两台机器同时运行,但彼此均设为备机,当某一台服务器出现故障时,另一台服务器可以在短时间内将故障服务器的应用接管过来,从而保证了应用的持续性,这种方式实际上是双机热备方案的一种应用。
前面一篇中做了一个主从复制,也就是双机热备,这一篇中来看下,双主互备,我们系统架构中常常需要考虑到这样的问题,数据库服务器挂掉了,完蛋了,当然这就导致了客户端无法访问的情况,对于一些重要系统而言,用户是很难忍受这样长时间的服务中断的。因此,就需要通过双机热备服务,来避免长时间的服务中断,保证系统长期、可靠的服务,上一篇中的主从热备方案就是我们可以临时的修改配置切换到从服务器,缩短了服务中断的时间,此篇中我们来看下双机互备的方案,我们借助nginx实现负载,在一个服务A挂掉的情况下,无缝切换到另外一个服务B,用户不会中断服务正常访问,而且能够在服务A修复之后,B中的数据能够自动同步到A,当然在B服务器挂掉的情况下,A中可以正常写入数据,B服务器修复重启之后,A中数据可以自动同步到B,这样就实现了双机互备。
Mysql配置
上一篇我们已经了解了Mysql服务器的主从配置,Mysql的双主配置也很简单,就是在从服务器上创建一个主服务器访问的用户,然后在主服务器配置从服务器的信息,然后start slave就可以了。
先在docker中启动两个mysql容器
docker run -p 3308:3306 --name mysql01 -v D:\Docker\mysql\mysql01\mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 docker run -p 3309:3306 --name mysql02 -v D:\Docker\mysql\mysql02\mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
2. mysql配置
mysql01配置:
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql server-id=1 #采用自然数,保持唯一即可 read-only=0 #0代表读写均可 log-bin=mysql-bin #二进制日志 auto_increment_offset = 1 #自增长ID 一般不用这个,跨服务器分库的时候才用 auto_increment_increment = 2 #奇数ID,一般不用这个,跨服务器分库的时候才用
mysql02配置:
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql server-id=2 read-only=0 log-bin=mysql-bin #二进制日志 auto_increment_offset = 2 #自增长ID,一般不用这个,跨服务器分库的时候才用 auto_increment_increment = 2 #偶数ID,一般不用这个,跨服务器分库的时候才用
如果不做其他的要求,两个服务器的配置除了server-id不同,其他的都可以相同。
配置完成重启两个容器
docker restart mysql01 mysql02
配置主从配置
首先,在容器mysql01中添加服务器2访问的用户,并赋给权限。
docker exec -it mysql01 mysql -uroot -p123456 grant replication slave on *.* to test_slave@'%' identified by '123456'; show master status;
其次,在容器mysql02中添加从服务器1访问的用户,并赋给权限。
docker exec -it mysql02 mysql -uroot -p123456 grant replication slave on *.* to test_slave@'%' identified by '123456'; show master status;
并增加服务器1的同步参数,启动从服务器,查看参数。
change master to master_host='10.238.64.31',master_port=3308,master_user='test_slave',master_password='123456',master_log_file='mysql-bin.000011',master_log_pos=443; start slave; show slave status \G;
最后,修改服务器1的同步服务器2的参数,启动并查看状态。
change master to master_host='10.238.64.31',master_port=3309,master_user='test_slave',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=443; start slave; show slave status \G;
查看同步情况
在服务器mysql01中新建数据库test,刷新mysql02,test存在,mysql02同步mysql01成功。
在服务器mysql02中删除数据库test,刷新mysql01,test也已经被删除,mysql01同步mysql02成功。两个数据库互为主库,成功。
Nginx负载
在新版本的nginx是支持四层代理模式的,默认情况下,此模块不构建,应使用配置参数启用 –with-stream。下面使用docker安装nginx
查看镜像
nginx配置
worker_processes 1; events { use epoll; worker_connections 1024; } stream { upstream mysql { server 10.238.64.31:3308 max_fails=3 fail_timeout=30s; server 10.238.64.31:3309 backup; } server { listen 3306; proxy_connect_timeout 3000s; proxy_timeout 6000s; proxy_pass mysql; } }
启动容器
docker run -p 3316:3306 --name nginx_db -v "D:\Docker\nginx\conf\nginx.conf":/etc/nginx_bak/nginx.conf -v D:\Docker\nginx\html\:/usr/share/nginx/html -it -d nginx
进入bash,删除/etc/nginx/nginx.cnf,将/etc/nginx_bak/nginx.conf复制到/etc/nginx/。然后重启nginx。