前提:mysql已经安装完成。

一、主主数据同步,为了防止丢失,可全量备份。

$ mysqldump —all-databases -uroot -p > mysql.sql

二、配置MySQL主主同步

主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。
创建同步账号

1. 分别在两台机器上配置同步账号

master1机器上:

  1. mysql> grant all privileges on *.* to 'repl'@'%' identified by '123456';
  2. mysql> flush privileges;

master2机器上:

  1. mysql> grant all privileges on *.* to 'repl'@'%' identified by '123456';
  2. mysql> flush privileges;

2. 配置数据库参数

master1机器上:
关闭mysql
$ service mysql stop
更改配置文件/etc/my.cnf
$ vi /etc/my.cnf

  1. [mysqld]
  2. datadir=/var/lib/mysql
  3. socket=/var/lib/mysql/mysql.sock
  4. server-id=1
  5. log-bin=mysql-bin
  6. relay_log=mysql-relay-bin
  7. binlog_format=ROW
  8. report-host = master2
  9. report-user = repl
  10. report-password = 123456
  11. report-port = 3306
  12. [mysqld_safe]
  13. log-error=/var/log/mysqld.log
  14. pid-file=/var/run/mysqld/mysqld.pid

其中标红为新增内容:
server-id=1
log-bin=mysql-bin
binlog_format=ROW
report-host = master2
report-user = repl
report-password = 123456
report-port = 3306
Log-bin:启动二进制日志文件
Server-id:本机数据库ID(和)
Binlog_format:一共有三种复制方式:ROW\STATEMENT\MIXED,默认是STATEMENT
report-host,report-user,report-password,report-port为master复制的主机名,用户,密码以及端口号。
启动mysql
$ service mysql start

Master2机器上:
关闭mysql
$ service mysql stop
更改配置文件/etc/my.cnf
$ vi /etc/my.cnf

  1. [mysqld]
  2. datadir=/var/lib/mysql
  3. socket=/var/lib/mysql/mysql.sock
  4. server-id=1
  5. log-bin=mysql-bin
  6. relay_log=mysql-relay-bin
  7. binlog_format=ROW
  8. report-host = master2
  9. report-user = repl
  10. report-password = 123456
  11. report-port = 3306
  12. [mysqld_safe]
  13. log-error=/var/log/mysqld.log
  14. pid-file=/var/run/mysqld/mysqld.pid

启动mysql
$ service mysql start

3. 设置master2同步master1

master1机器上:
image.jpeg

master2机器上:

  1. #设置master2同步master1数据
  2. mysql> change master to master_host='master1IP', master_port=3306, master_user='repl',master_password='123456', master_log_file='binlog.000003',master_log_pos=365;
  3. #开启同步
  4. mysql> start slave;
  5. #执行这命令后 注意观察下面这两个参数,必须要都是yes才行
  6. mysql> show slave status \G
  7. Slave_IO_Running: Yes
  8. Slave_SQL_Running: Yes

master_host表示是master1的IP
master_user表示主库master1上允许同步的用户
maser_password表示同步用户的密码
master_log_file表示从哪个binlog文件开始同步
master_log_pos表示从该binlog文件的那个pos节点位置开始同步
我们查看同步是否主要是查看Slave_IO_Running与Slave_SQL_Running选项。如果正常同步,这两选必须同时为YES。
如果Slave_IO_Running为NO,说明可能是从库与主库的网络不通。
如果Slave_SQL_Running为NO,说明很可能是从库与主库的数据不一致。
如果Slave_IO_Running: Connecting,可能是同步的用户密码写错了。
同样的 反过来做相同操作

4. 设置master1同步master2

master2机器上:
image.jpeg
master1机器上:

  1. mysql> change master tomaster_host='10.1.1.21', master_port=3306, master_user='repl',master_password='123456', master_log_file='binlog.000004',master_log_pos=207;
  2. mysql> start slave;
  3. mysql> show slave status \G #执行这命令后 注意观察下面这两个参数,必须要都是yes才行
  4. Slave_IO_Running: Yes
  5. Slave_SQL_Running: Yes

介此,主主同步打造完成,可以简单测试一下,分别在两个机器上写数据 看看会不会同步到另一台机器上
PS:如果报错Slave_IO_Running: NO 可以检查同步的账号是否创建正常!

三、安装keepalived 并设置监控

keepalived是安装在两台MySQL服务器上的
首先安装keepalived 过程不解释就正常解压安装就好
安装后配置 vim /etc/keepalived/keepalived.conf 内容如下
master1(10.1.1.20)的配置文件

  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 127.0.0.1
  10. smtp_connect_timeout 30
  11. router_id LVS_DEVEL
  12. }
  13. vrrp_instance VI_1 {
  14. state backup #两台配置此处均是BACKUP
  15. interface eth0
  16. virtual_router_id 51
  17. priority 100 #优先级,另一台改为90
  18. advert_int 1
  19. nopreempt #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
  20. authentication {
  21. auth_type PASS
  22. auth_pass 1111
  23. }
  24. virtual_ipaddress {
  25. 10.1.1.25
  26. }
  27. }
  28. virtual_server 10.1.1.25 3306 {
  29. delay_loop 6
  30. lb_algo wrr
  31. lb_kind DR
  32. persistence_timeout 50 #会话保持时间
  33. protocol TCP
  34. real_server 10.1.1.20 3306 {
  35. weight 3
  36. notify_down /tmp/nimei.sh #检测到mysql服务挂了就执行这个脚本(脚本要自己写哈)
  37. TCP_CHECK {
  38. connect_timeout 10 #连接超时时间
  39. nb_get_retry 3 #重连次数
  40. delay_before_retry 3 #重连间隔时间
  41. connect_port 3306 #健康检查端口
  42. }
  43. }
  44. }

master2(10.1.1.21)的配置文件

  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 127.0.0.1
  10. smtp_connect_timeout 30
  11. router_id LVS_DEVEL
  12. }
  13. vrrp_instance VI_1 {
  14. state backup
  15. interface eth0
  16. virtual_router_id 51
  17. priority 90
  18. advert_int 1
  19. authentication {
  20. auth_type PASS
  21. auth_pass 1111
  22. }
  23. virtual_ipaddress {
  24. 10.1.1.25
  25. }
  26. }
  27. virtual_server 10.1.1.25 3306 {
  28. delay_loop 6
  29. lb_algo wrr
  30. lb_kind DR
  31. persistence_timeout 50
  32. protocol TCP
  33. real_server 10.1.1.21 3306 {
  34. weight 3
  35. notify_down /tmp/nimei.sh
  36. TCP_CHECK {
  37. connect_timeout 10
  38. nb_get_retry 3
  39. delay_before_retry 3
  40. connect_port 3306
  41. }
  42. }
  43. }

编写监控mysql服务是否挂了的脚本,按照上面配置文件的位置编写脚本。
vim /tmp/nimei.sh

  1. #!/bin/sh
  2. pkill keepalived

脚本很简单就一句,目的是当keepalived检测到mysql服务挂了之后触发这个脚本,杀死keepalived进程,让另一台机器接管好 修改后启动keeplived服务
介此整个集群搭建完成

四、测试

找一台机器用虚拟ip连接mysql
这样成功连上了,然后你可以任意关闭某台机器,或者某台机器的mysql服务,看看还能不能连上!!

参考网址:https://cloud.tencent.com/developer/article/1119242