MySQL-双主复制

  • mysql 双主复制:
    • 实现和MHA(高可用架构)相同的效果。
    • 使用keepalived实现先双主热备,防止单点故障的主从结构。
    • 两台mysql互做主从,各自安装keepalived实现热备,其他从服务器和热备的虚拟IP建立主从连接
  • mysql双主复制是一种数据库复制架构,允许在两个mysqld服务器之间进行双向数据同步,这种复制架构可以提高数据的可用性,和可靠性,同时允许在两个服务器上进行读写操作。
  • 实验前提环境:
    • 首先开启两台mysql,互做主从
    • db1:192.168.8.5
    • db2:192.168.8.6
    • db3:192.168.8.12
  • 实验步骤:
    • 修改每台数据库的/etc/my.cnf文件,开启binlog日志和gtid日志
    • db1:
      • cat > /etc/my.cnf <<EOF
      • [mysqld]
      • basedir=/usr/local/mysql/
      • datadir=/usr/local/mysql/data
      • socket=/tmp/mysql.sock
      • server_id=1
      • port=3306
      • secure-file-priv=/tmp
      • autocommit=1
      • log_bin=mysql-bin
      • binlog_format=row
      • gtid-mode=on
      • enforce-gtid-consistency=true
      • log-slave-updates=1
      • [mysql]
      • prompt=db01>
      • EOF
    • db2:
      • cat > /etc/my.cnf <<EOF
      • [mysqld]
      • basedir=/usr/local/mysql
      • datadir=/usr/local/mysql/data
      • socket=/tmp/mysql.sock
      • server_id=2
      • port=3306
      • secure-file-priv=/tmp
      • autocommit=1
      • log_bin=mysql-bin
      • binlog_format=row
      • gtid-mode=on
      • enforce-gtid-consistency=true
      • log-slave-updates=1
      • [mysql]
      • prompt=db02>
      • EOF
    • db3:
      • cat > /etc/my.cnf <<EOF
      • [mysqld]
      • basedir=/usr/local/mysql
      • datadir=/usr/local/mysql/data
      • socket=/tmp/mysql.sock
      • server_id=3
      • port=3306
      • secure-file-priv=/tmp
      • autocommit=1
      • log_bin=mysql-bin
      • binlog_format=row
      • gtid-mode=on
      • enforce-gtid-consistency=true
      • log-slave-updates=1
      • [mysql]
      • prompt=db03>
      • EOF
    • 启动三台数据库:systemctl restart mysqld
    • db1上面创建一个复制用户:
      • grant replication slave on *.* to repl@'192.168.8.%' identified by '123456';
    • db2与db1建立主从关系:
      • change master to
      • master_host='192.168.8.5',
      • master_user='repl',
      • master_port=3306,
      • master_password='123456' ,
      • MASTER_AUTO_POSITION=1;
      • start slave;
    • db1与db2再建立主从关系:
      • change master to
      • master_host='192.168.8.6',
      • master_user='repl',
      • master_port=3306,
      • master_password='123456' ,
      • MASTER_AUTO_POSITION=1;
      • start slave;
    • 查看slave 状态:show slave status \G
  •  
    • 两台主从搭建好之后,再在db1和db2上面安装leepalived:
      • yum -y install keepalived
      • 配置db1的keepalived配置文件:
        • vim /etc/keepalived/keepalived.conf
          • global_defs {
          • router_id mysql1
          • }
          • vrrp_instance VI_1 {
          • state MASTER
          • interface ens33
          • virtual_router_id 51
          • priority 100
          • advert_int 1
          • authentication {
          • auth_type PASS
          • auth_pass 1111
          • }
          • virtual_ipaddress {
          • 192.168.8.254
          • }
          • }
          • virtual_server 192.168.8.254 3306 {
          • delay_loop 6
          • lb_algo rr
          • lb_kind DR
          • persistence_timeout 50
          • protocol TCP
          • real_server 192.168.8.5 3306 {
          • weight 1
          • TCP_CHECK {
          • connect_port 3306
          • connect_timeout 3
          • retry 3
          • delay_before_retry 3
          • }
          • }
          • }
        • 启动keepalived:systemctl start keepalived
      • 配置db2的keepalived配置文件:
        • vim /etc/keepalived/keepalived.conf
          • global_defs {
          • router_id mysql2
          • }
          • vrrp_instance VI_1 {
          • state BACKUP
          • interface ens33
          • virtual_router_id 51
          • priority 99
          • advert_int 1
          • authentication {
          • auth_type PASS
          • auth_pass 1111
          • }
          • virtual_ipaddress {
          • 192.168.8.254
          • }
          • }
          • virtual_server 192.168.8.254 3306 {
          • delay_loop 6
          • lb_algo rr
          • lb_kind DR
          • persistence_timeout 50
          • protocol TCP
          • real_server 192.168.8.6 3306 {
          • weight 1
          • TCP_CHECK {
          • connect_port 3306
          • connect_timeout 3
          • retry 3
          • delay_before_retry 3
          • }
          • }
          • }
        • 启动keepalived:systemctl start keepalived
      • 查看db1服务器上是否出现了虚拟IP:ip a show dev ens33
  •  
    • 高可用搭建好之后,我们使用db3再与虚拟IP建立主从关系:
      • 先试用ping测试一下 db3是否可以与虚拟IP建立通信
      • 如果ping 不同的话,则将db1的keepalived关闭 切换到db2,再开启db1,切换回来,这样将虚拟ip激活一下
    • 登录db3,与虚拟ip建立主从关系:
      • change master to
      • master_host='192.168.8.254',
      • master_user='repl',
      • master_port=3306,
      • master_password='123456' ,
      • MASTER_AUTO_POSITION=1;
      • start slave;
    • 查看主从关系:show slave status \G
  • 至此我们双主复制则搭建完毕:
    • 最终实现效果:db1和db2写入数据都可以同步到另外两台服务器
      • 假如db1宕机了,漂移地址会自动转移到db2上面,在db2上面写入数据,还是可以同步到db3上
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!要在 Docker 上安装双主 MySQL,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了 Docker。如果还没有安装,请根据您的操作系统进行安装。 2. 创建一个用于存储数据库文件的目录,例如 `mysql-data`: ``` mkdir mysql-data ``` 3. 创建一个网络以便容器之间进行通信: ``` docker network create mysql-network ``` 4. 运行第一个 MySQL 容器作为主服务器1: ``` docker run -d --name=mysql-master1 --net=mysql-network -e MYSQL_ROOT_PASSWORD=your_root_password -e MYSQL_REPLICATION_USER=repl -e MYSQL_REPLICATION_PASSWORD=repl_password -v /path/to/mysql-data:/var/lib/mysql mysql ``` 请将 `your_root_password` 替换为您希望设置的 root 密码,将 `/path/to/mysql-data` 替换为步骤 2 中创建的目录。 5. 运行第二个 MySQL 容器作为主服务器2: ``` docker run -d --name=mysql-master2 --net=mysql-network -e MYSQL_ROOT_PASSWORD=your_root_password -e MYSQL_REPLICATION_USER=repl -e MYSQL_REPLICATION_PASSWORD=repl_password -v /path/to/mysql-data:/var/lib/mysql mysql ``` 6. 创建一个用于复制的用户并授予适当的权限: ``` docker exec -it mysql-master1 mysql -uroot -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_password'; FLUSH PRIVILEGES;" ``` 7. 配置主从复制: - 获取主服务器1的 IP 地址: ``` docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master1 ``` - 获取主服务器2的 IP 地址: ``` docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master2 ``` - 在主服务器2上,执行以下命令并替换 `<master1_ip>` 为主服务器1的 IP 地址: ``` docker exec -it mysql-master2 mysql -uroot -p -e "CHANGE MASTER TO MASTER_HOST='<master1_ip>', MASTER_USER='repl', MASTER_PASSWORD='repl_password';" ``` - 在主服务器1上,执行以下命令并替换 `<master2_ip>` 为主服务器2的 IP 地址: ``` docker exec -it mysql-master1 mysql -uroot -p -e "CHANGE MASTER TO MASTER_HOST='<master2_ip>', MASTER_USER='repl', MASTER_PASSWORD='repl_password';" ``` 8. 启动主从复制: - 在主服务器2上,执行以下命令: ``` docker exec -it mysql-master2 mysql -uroot -p -e "START SLAVE;" ``` - 在主服务器1上,执行以下命令: ``` docker exec -it mysql-master1 mysql -uroot -p -e "START SLAVE;" ``` 现在,您已经成功在 Docker 上安装了双主 MySQL。请确保根据您的需求进行适当的配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力转型的IT小王

希望获得您的认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值