离线部署MySQL+MyCat+Haproxy+Keepalived的数据库集群,使用docker的方式

前言:

先参考了文章:https://blog.csdn.net/qq_33842795/article/details/90407394,在本地搭建了环境。

本次离线部署,将使用上一次过程中,构建的docker镜像。

结构如图,保证高可用

1.安装docker与docker-compose

    请参考文章离线安装docker,docker-compose

2.准备离线安装的文件

     

    1.三个docker镜像文件,mysql5.7.tar,mycat1.6.tar,haproxy1.7.tar。

        mysql的镜像可以使用官方的,没有改动。mycat的镜像是上一次自己制作的。haproxy的镜像,也是使用的官方的。

    2.keepalived离线安装包与依赖

        keepalived因为要虚拟宿主机网段的虚拟IP并监听,需要直接安装在宿主机上面。

        包含安装包  https://www.keepalived.org/software/keepalived-2.0.6.tar.gz

        依赖包,在这个网址http://www.rpmfind.net/linux/RPM/index.html 慢慢找吧。。。

        

    3.配置文件。docker-compose.yml文件、mysql的配置文件my.cnf、mycat的一整套配置文件haproxy.cfgkeepalived.cfg

        首先,docker-compose.yml文件,这里描述了需要启动的一些列docker容器。

        主要是网络模式、端口映射、文件挂载等的配置。

version: '3'
services:
 haproxy:
   restart: always
   image: haproxy :1.7
   container_name: haproxy
   privileged: true
   networks:
     mcnet:
       ipv4_address: 172.18.0.9
   volumes:
     - ./haproxy:/usr/local/etc/haproxy
   ports:
     - "8888:8888"
     - "9000:9000"
 mycat:
   restart: always
   image: mycat:1.6
   networks:
     mcnet:
       ipv4_address: 172.18.0.10
   volumes:
     - ./mycat/logs/:/usr/local/mycat/logs/
     - ./mycat/conf/:/usr/local/mycat/conf/
   ports:
     - "4001:8066"
     - "9001:9066"
 mysql:
   restart: always
   image: mysql:5.7
   container_name: mysql
   privileged: true
   volumes:
     - ./mysql/data:/var/lib/mysql
     - ./mysql/conf/my.cnf:/etc/mysql/my.cnf
   ports:
     - "3307:3306"
   environment:
     - MYSQL_ROOT_PASSWORD=root

networks:
  mcnet:
    external: false
    ipam:
      config:
      - subnet: 172.18.0.0/16

      其次,mysql的配置my.cnf,要做一个互为主从的双主数据库。

[mysql]

# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8

#========主从复制关键配置======================
server_id=1 #主库和从库需要不一致
log-bin=mysql-bin #二进制文件存放路径,存放在根目录data
auto_increment_increment = 2 #自增ID的步长
auto_increment_offset = 1 #自增ID的起点,另一个要是2
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
slave-skip-errors = all
binlog-ignore-db=mysql

      然后,是mycat的schema.xml文件的配置。

      预计会在两台服务器上装,所以要配置两个MySQL的地址。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="uc" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
        <schema name="acs" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2"></schema>
        <schema name="prod" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn3"></schema>
        <schema name="key" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn4"></schema>
        <schema name="log" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn5"></schema>


        <dataNode name="dn1" dataHost="localhost1" database="uc" />
        <dataNode name="dn2" dataHost="localhost1" database="acs" />
        <dataNode name="dn3" dataHost="localhost1" database="prod" />
        <dataNode name="dn4" dataHost="localhost1" database="key" />
        <dataNode name="dn5" dataHost="localhost1" database="log" />

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="jdbc:mysql://192.168.3.220:3306" user="user_common"
                                   password="user_common">
                </writeHost>
                <writeHost host="hostM2" url="jdbc:mysql://192.168.3.237:3308" user="user_common"
                                   password="user_common">
                </writeHost>
        </dataHost>
</mycat:schema>

       接着是mycat的server.xml的配置,只显示最下面用户的配置:

。。。。。。
。。。。。。


	  <user name="user_common" defaultAccount="true">
            <property name="password">user_common</property>
            <property name="schemas">uc,acs,prod,key,log</property>
            <property name="defaultSchema">uc</property>
            
    </user>

      haproxy的配置,haproxy.cfg。haproxy负载均衡两台服务器上的mycat。

global
        #工作目录
        chroot /usr/local/etc/haproxy
        #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
        log 127.0.0.1 local5 info
        #守护进程运行
        daemon

defaults
        log 127.0.0.1 local0 err #[err warning info debug]
        mode http                #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
        retries 2                #两次连接失败就认为是服务器不可用,也可以通过后面设置
        option redispatch        #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
        option abortonclose      #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
        option dontlognull       #日志中不记录负载均衡的心跳检测记录
        maxconn 4096             #默认的最大连接数
        timeout connect 5000ms   #连接超时
        timeout client 30000ms   #客户端超时
        timeout server 30000ms   #服务器超时
        #timeout check 2000      #=心跳检测超时

######## 监控界面配置 #################
listen  admin_stats
        #监控界面的访问的IP和端口
        bind  0.0.0.0:8888
        #访问协议
    mode        http
        #URI相对地址
    stats uri   /dbs
        #统计报告格式
    stats realm     Global\ statistics
        #登陆帐户信息
    stats auth  admin:admin

########frontend配置##############
#mycat负载均衡
listen  proxy-mycat
        #访问的IP和端口
        bind  0.0.0.0:9000
        #网络协议
        mode  tcp
        #负载均衡算法(轮询算法)
        #轮询算法:roundrobin
        #权重算法:static-rr
        #最少连接算法:leastconn
        #请求源IP算法:source
        balance  roundrobin
        # 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
        server mycat_01 192.168.3.220:4001 check weight 1 maxconn 2000
        server mycat_02 192.168.3.237:4001 check weight 1 maxconn 2000
        # 使用keepalive检测死链
        option tcpka

   

3.将文件拷贝到服务器

    如果使用的是putty链接服务器,可以是使用pputty的PSFTP。

    将准备好的文件打包。打开PSFTP

#链接服务器
open 192.168.3.220

#输入账号密码

#上传
put C:\Users\e490\Desktop\mysql-cluster.tar.gz /home/docker/mysql-cluster.tar.gz

    因为是数据库,最好拷贝到服务器上上最大的分区,一般是/home下的。

    解压文件夹。

cd /home/docker
tar -zxvf mysql-cluster.tar.gz

4.安装准备好的镜像

#进入放镜像的目录
cd /home/docker/mysql-cluster/docker_images

#载入镜像
docker load -i mysql5.7.tar
docker load -i mycat1.6.tar
docker load -i haproxy1.7.tar

#查看已有镜像
docker images

    准备结束。两台服务器请执行相同的准备操作。

5.启动数据库

    请先确认mysql的配置文件my.cnfdocker-compose.yml中mysql的端口映射,以及配置的root密码,我这里写的是root。

#进入mysql-cluster目录
cd /home/docker/mysql-cluster

#创建mysql的容器并启动
docker-compose up -d mysql

#检查启动状态,会列出该配置文件下的容器的状态,状态为up就是启动成功
docker-compose ps

#查看日志,若启动出现问题,或者服务出现问题,可以查看
docker-compose logs mysql

#关闭容器
docker-compose stop mysql

#启动容器
docker-compose start mysql

#重启容器
docker-compose restart mysql

#删除容器
docker-compose rm mysql

    两个数据库都启动后,使用客户端链接下数据库,确认是否启动成功。

    注意:我在安装的时候,整个文件夹都变成了绿色的,好像是777权限,这种情况下,mysql的配置文件不会被采用,要把my.cnf的权限改成普通的 chmod 644 my.cnf。不止my.cnf文件,它的父文件也要改。这样my.cnf才会被读取。

    请建立互为主从的关系。方法请参考:https://blog.csdn.net/Valhalla6416/article/details/108603817

    之后,建立数据库,导入数据等等

6.启动MyCat

    确认schema.xml中配置的两台数据库的地址端口等。以及其它的mycat的schema的配置。

    确认server.xml中配置的mycat的账户、密码的配置。

#进入mysql-cluster目录
cd /home/docker/mysql-cluster

#创建mycat的容器并启动
docker-compose up -d mycat

#检查启动状态,会列出该配置文件下的容器的状态,状态为up就是启动成功
docker-compose ps

#其他的命令,mysql那已经写过,不再赘述
......

    两个服务器的mycat都启动成功后,使用客户端登录一下,我这里映射的端口是4001,使用宿主机IP+4001,查看是否成功。

    如不成功,可以查看日志,mycat自身的日志已经挂载在mysql-cluster/mycat/logs目录下面了,可以去看。

7.启动haproxy

    确认配置文件,haproxy.cfg中的mycat的地址是否正确。

    确认keepalived.cfg中的本机的haproxy的代理的端口是否正确,确认虚拟的IP是否同一网段,且没被人使用。

#进入mysql-cluster目录
cd /home/docker/mysql-cluster

#创建haproxy的容器并启动
docker-compose up -d haproxy

#检查启动状态,会列出该配置文件下的容器的状态,状态为up就是启动成功
docker-compose ps

#其他的命令,mysql那已经写过,不再赘述
......

    检查是否启动成功。 我这里haproxy代理的myCat的端口是9000。

    keepalived监听的是虚拟IP192.168.3.207,9000端口

8.宿主机安装keepalived

    安装依赖,进入keepalived的依赖包所在的文件夹,

rpm -Uvh --nodeps --force *.rpm

    安装keepalived,进入keepalived的压缩包所在文件夹。

#解压到当前文件 
tar zxvf keepalived-2.0.6.tar.gz
#进入文件夹
cd keepalived-2.0.6
#指定安装目录
./configure --prefix=/usr/local/keepalived
#编译
make && make install
#配置文件目录创建
mkdir /etc/keepalived
#把准备好的配置文件复制到指定位置
cp /home/docker/mysql-cluster/keepalived/keepalived.conf /etc/keepalived/

    设置keepalived 开机启动

chkconfig keepalived on

    修改配置文件, /etc/keepalived/keepalived.conf

    注意,interface 后面的是网卡名,使用命令 ip a 检查本机的真实网卡,把名字写上去。

vrrp_instance  VI_1 {

    state  MASTER

    interface  eth0
    virtual_router_id  100

    priority  100

    advert_int  1

    authentication {
        auth_type  PASS
        auth_pass  123456
    }
    virtual_ipaddress {
        192.168.3.207
    }
}

virtual_server 192.168.3.207 8888 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 172.18.0.9 8888 {
        weight 1
    }
}

virtual_server 192.168.3.207 9000 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 172.18.0.9 9000 {
        weight 1
    }
}

        确认配置文件的权限,chmod 644 /etc/keepalived/keepalived.conf

启动keepalived

#启动
service keepalived start
#关闭
service keepalived stop
#重启
service keepalived stop
#检查状态
service keepalived status

    这里虚拟的IP是192.168.3.207,最终,可以通过192.168.3.207:9000来访问数据库,用户密码为myCat中配置的用户密码。

#过程中可能出现的错误

1.ERROR: Pool overlaps with other one on this address space。

   原因可能是docker配置的内联网络的网段已被人占用。

   修改配置的内联网络的网段,如172.18.0.0改为173.18.0.0

2.ERROR: for haproxy  Cannot start service haproxy: driver failed programming external connectivity on endpoint haproxy (fe09c4f35a8c338b67879283203786c30486e7c1f0d17fd644eb80cf27e4e49a):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9000 -j DNAT --to-destination 174.18.0.9:9000 ! -i br-ea45f7f7b240: iptables: No chain/target/match by that name.
 (exit status 1))

   需要重启docker,命令:service docker restart

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值