云上 docker 安装 MySQL8+keepalived双主热备高可用

环境准备

两台云服务器:IP1:10.0.1.143,IP2: 10.0.1.237

申请虚拟IP:10.0.1.204

流程说明

VIP地址为10.0.1.204,如果主机10.0.1.143挂了,会自动切换到备机10.0.1.237上,由于是双主,数据可以进行同步恢复

部署流程大致为

  1. 在10.0.1.143服务器上部署docker、mysql一主一丛
  2. 在10.0.1.237服务器上部署docker、mysql一主一丛
  3. 10.0.1.143的Master1数据库和10.0.1.237的数据库互为主从
  4. 在两台服务器上安装keeplived形成高可用

配置第一台一主一丛

创建主配置文件和目录

mkdir -p /data/mysql/master/config
mkdir -p /data/mysql/master/data
mkdir -p /data/mysql/master/logs
touch /data/mysql/master/config/my.cnf
chmod +x /data/mysql/master/config/my.cnf

 创建从配置文件和目录

mkdir -p /data/mysql/slave/config
mkdir -p /data/mysql/slave/data
mkdir -p /data/mysql/slave/logs
touch /data/mysql/slave/config/my.cnf
chmod +x /data/mysql/slave/config/my.cnf

主my.cnf配置文件 

[mysqld]
server-id=101

max_connections=500
max_allowed_packet=32M
wait_timeout=600

slow_query_log=ON
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=1
log_queries_not_using_indexes=ON
log_throttle_queries_not_using_indexes=10

max_execution_time=600
log-bin=mysql-bin
binlog_format=ROW
max_binlog_size=500M
max_binlog_cache_size=1G
max_binlog_stmt_cache_size=1G

innodb_flush_method=O_DIRECT
innodb_log_buffer_size=1024M
innodb_buffer_pool_size=512M
innodb_print_all_deadlocks=1
innodb_rollback_on_timeout=ON
innodb_deadlock_detect=ON

max_relay_log_size=500M
relay_log_purge=ON
relay_log_recovery=ON

log_replica_updates=ON

host_cache_size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

 从 my.cnf配置文件 

[mysqld]
server-id=102

max_connections=500
max_allowed_packet=32M
wait_timeout=600

slow_query_log=ON
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=1
log_queries_not_using_indexes=ON
log_throttle_queries_not_using_indexes=10

max_execution_time=600
log-bin=mysql-bin
binlog_format=ROW
max_binlog_size=500M
max_binlog_cache_size=1G
max_binlog_stmt_cache_size=1G

innodb_flush_method=O_DIRECT
innodb_log_buffer_size=1024M
innodb_buffer_pool_size=512M
innodb_print_all_deadlocks=1
innodb_rollback_on_timeout=ON
innodb_deadlock_detect=ON

max_relay_log_size=500M
relay_log_purge=ON
relay_log_recovery=ON

log_replica_updates=ON

host_cache_size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

使用docker-compose.yml安装Mysql8,执行如下命令 

version: '3'
services: 
  mysql_master:
    image: mysql:8.0.30
    restart: always
    container_name: mysql_master
    volumes:
      - /data/mysql/master/data:/var/lib/mysql
      - /data/mysql/master/config/my.cnf:/etc/mysql/conf.d/my.cnf
      - /data/mysql/master/logs:/var/log/mysql
      #      数据库还原目录 可将需要还原的sql文件放在这里
      - /data/mysql/init/mysql:/docker-entrypoint-initdb.d
    environment:
      - "MYSQL_ROOT_PASSWORD=yx@123456"
      - "MYSQL_DATABASE=test"
      - "TZ=Asia/Shanghai"
    ports:
      - 3306:3306
    privileged: true
  mysql_slave:
    image: mysql:8.0.30
    restart: always
    container_name: mysql_slave
    volumes:
      - /data/mysql/slave/data:/var/lib/mysql
      - /data/mysql/slave/config/my.cnf:/etc/mysql/conf.d/my.cnf
      - /data/mysql/slave/logs:/var/log/mysql
      #      数据库还原目录 可将需要还原的sql文件放在这里
      - /data/mysql/init/mysql:/docker-entrypoint-initdb.d
    environment:
      - "MYSQL_ROOT_PASSWORD=yx@123456"
      - "MYSQL_DATABASE=test"
      - "TZ=Asia/Shanghai"
    ports:
      - 4306:3306
    privileged: true

在主机上安装mysql客户端软件

wget https://cdn.mysql.com/archives/mysql-8.0/mysql-community-client-8.0.32-1.el7.x86_64.rpm

wget https://cdn.mysql.com/archives/mysql-8.0/mysql-community-client-plugins-8.0.32-1.el7.x86_64.rpm

wget https://cdn.mysql.com/archives/mysql-8.0/mysql-community-libs-8.0.32-1.el7.x86_64.rpm

wget https://cdn.mysql.com/archives/mysql-8.0/mysql-community-common-8.0.32-1.el7.x86_64.rpm

检查 rpm -qa | grep mariadb 并卸载

[root@wy9jygsgl0t9rcw5-0002 client]#  rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@wy9jygsgl0t9rcw5-0002 client]# rpm -e  --nodeps mariadb-libs-5.5.68-1.el7.x86_64
rpm -ivh mysql-community-common-8.0.32-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-plugins-8.0.32-1.el7.x86_64.rpm

rpm -ivh mysql-community-libs-8.0.32-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-8.0.32-1.el7.x86_64.rpm


 登陆主数据库

mysql -h10.0.1.143 -P3306 -uroot -p

  创建账号 

CREATE USER r_yxwg identified with mysql_native_password by 'r_yx@123456';

GRANT REPLICATION SLAVE ON *.* to 'r_yxwg'@'%';

FLUSH PRIVILEGES;

查询主库文件和标识 

SHOW MASTER STATUS;

 登陆从数据库

mysql -h10.0.1.143 -P4306 -uroot -p

文件和标识为主库的 

change master to master_host='10.0.1.143',master_port=3306,master_user='r_yxwg',master_password='r_yx@123456',master_log_file='mysql-bin.000003',master_log_pos=823;
start slave;


show slave status\G; 

 

配置第二台一主一丛 

创建流程第一台一样(同上)

主主配置

登陆A服务器mysql -h10.0.1.143 -P3306 -uroot -p

CREATE USER repl identified with mysql_native_password by 'repl@123456';
GRANT REPLICATION SLAVE ON *.* to 'repl'@'%';
flush privileges;

-- 添加写锁,防止设置过程中,写入数据,导致binlog和pos发生变化
flush tables with read lock;
-- 查看当前MySQL的master_log_file和master_log_position的值

show master status ;

unlock tables ;

登陆B服务器执行如下操作 

stop slave ;
change master to master_host='10.0.1.237',master_port=3306,master_user='repl',master_password='repl@123456',master_log_file='mysql-bin.000003',master_log_pos=1485;
start slave ;
show slave status\G;

 

登陆B服务器mysql -h10.0.1.237 -P3306 -uroot -p

CREATE USER repl identified with mysql_native_password by 'repl@123456';
GRANT REPLICATION SLAVE ON *.* to 'repl'@'%';
flush privileges;

-- 添加写锁,防止设置过程中,写入数据,导致binlog和pos发生变化
flush tables with read lock;
-- 查看当前MySQL的master_log_file和master_log_position的值
show master status ;
unlock tables ;

 登陆A服务器执行如下操作

stop slave ;
change master to master_host='10.0.1.143',master_port=3306,master_user='repl',master_password='repl_yx21SA@WSX',master_log_file='mysql-bin.000004',master_log_pos=819;
start slave ;
show slave status\G;

 安装keepalived

两台服务器安装keepalived

yum -y install keepalived

修改主keepalived配置文件(/etc/keepalived/keepalived.conf)

global_defs {
    router_id mysql_master
    script_user root
    enable_script_security
}

vrrp_script check_mysql {
   script "/etc/keepalived/chk_mysql.sh"
   interval 5
   weight -10
   fall 2
   rise 1
}

vrrp_instance mysql {
    state MASTER
    interface enp0s8
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.1.204
    }

    track_script {
        chk_mysql
    }
}

上面修改VIP、网络名称enp0s8、检查脚本chk_mysql.sh

#!/bin/bash
counter=$(netstat -na | grep "LISTEN" | grep "3306" | wc -l)
if [ ${counter} -eq 0 ]; then
    killall keepalived
fi

修改备keepalived配置文件(/etc/keepalived/keepalived.conf)

global_defs {
    router_id mysql_master
    script_user root
    enable_script_security
}

vrrp_script check_mysql {
   script "/etc/keepalived/chk_mysql.sh"
   interval 5
   weight -10
   fall 2
   rise 1
}

vrrp_instance mysql {
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    priority 130
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.1.204
    }

    track_script {
        chk_mysql
    }
}

上面修改VIP、网络名称enp0s8、检查脚本chk_mysql.sh

#!/bin/bash
counter=$(netstat -na | grep "LISTEN" | grep "3306" | wc -l)
if [ ${counter} -eq 0 ]; then
    killall keepalived
fi

两边启动并加入开机自启动

[root@mysql1 ~]# systemctl start keepalived
[root@mysql1 ~]# systemctl enable keepalived

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker+Consul+Nginx+keepalived是一种常用的云原生架构方案,它结合了容器化、服务发现、负载均衡和高可用等多种技术手段,可用于构建高可用、弹性、可扩展的应用系统。 该方案的主要组件包括: 1. Docker:用于容器化应用程序和服务,提供了高效、轻量、可移植的应用打包和部署方式。 2. Consul:用于服务发现和配置管理,支持多数据中心、跨平台、高度可扩展的分布式系统。 3. Nginx:用于负载均衡和反向代理,支持高并发、高可用的流量分发。 4. keepalived:用于实现高可用的服务和节点,提供了基于 VRRP 协议的故障转移和自动切换功能。 在该方案中,Docker 容器作为应用程序和服务的运行环境,使用 Consul 进行服务注册和发现,并通过 Nginx 进行流量分发和负载均衡。同时,使用 keepalived 实现高可用的服务和节点,确保系统的稳定性和可用性。 项目描述可以按照以下步骤进行撰写: 1. 项目背景和目的:简要介绍本项目的背景和目的,说明为什么选择 Docker+Consul+Nginx+keepalived 方案。 2. 技术架构:详细介绍该方案的技术架构和组件,包括 Docker、Consul、Nginx 和 keepalived 的作用和使用方式。 3. 系统功能:描述系统的主要功能和特点,包括服务发现、负载均衡、高可用等方面。 4. 实现方式:介绍系统的具体实现方式和实现步骤,包括 Docker 镜像的构建、应用程序的容器化、Consul 的配置和使用、Nginx 的配置和使用、keepalived 的配置和使用等。 5. 测试和验证:对系统进行测试和验证,验证系统的功能和性能是否符合预期,是否满足高可用和弹性的要求。 6. 总结和展望:对本项目进行总结和展望,分析该方案的优缺点和适用范围,展望未来的发展方向和趋势。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值