基于docker+Keepalived+Haproxy+Mycat的高可用服务架构设计

1 篇文章 0 订阅
1 篇文章 0 订阅

环境

linux虚拟机

linux安装之后一些配置

1:关闭防火墙

systemctl stop firewalld.service

2:禁止firewall开机启动 (防火墙开机关闭)

systemctl disable firewalld.service

3:查看防火墙状态

firewall-cmd --state

4:设置开机网络自启动
参考连接 https://blog.csdn.net/yuki5233/article/details/79390414

vi /etc/sysconfig/network-scripts/ifcg-xxx ONBOOT=yes

安装docker 以及远程访问

参考连接 https://blog.csdn.net/qq_33842795/article/details/90407864

下载mycat

下载地址:http://www.mycat.io/

高可用安装

环境:

服务名docker-ip地址
mycat-01172.18.0.10
mycat-02172.18.0.11
mysql-01172.18.0.2
mysql-02172.18.0.4
mysql-03172.18.0.6

创建Dockerfile 文件

# 设置镜像的 base 镜像,这里我们使用 centos 系统镜像
FROM docker.io/centos
# 复制依赖的 jdk 文件,我这里是已经解压缩,如果是 tar 格式文件,使用 ADD
COPY jdk-8u211-linux-x64.tar.gz /usr/local/
RUN tar -zxvf /usr/local/jdk-8u211-linux-x64.tar.gz -C /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_211
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 复制 mycat 文件,我这里是已经解压缩,如果是 tar 或 gz 格式文件,使用 ADD
COPY Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz  /usr/local/
# 设置环境变量
RUN tar -zxvf /usr/local/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
ENV MYCAT_HOME=/usr/local/mycat
# 执行最终命令,启动 mycat
RUN source /etc/profile
RUN source ~/.bash_profile
CMD ["/usr/local/mycat/bin/mycat", "console"]

执行下面的命令,就可以生成我们需要的含jdk8的mycat1.6的镜像了(/home/mycat-server 这个是我的当前构建目录)
docker build -t centos-jdk8-mycat1.6 -f Dockerfile /home/mycat-server
输入 docker images 就会看到centos-jdk8-mycat1.6镜像

编写mycat的sechma.xml文件

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

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<!-- auto sharding by id (long) -->
		<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
	</schema>
	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
		/> -->
	<dataNode name="dn1" dataHost="mysql1" database="db1" />
	<dataNode name="dn2" dataHost="mysql2" database="db2" />
	<dataNode name="dn3" dataHost="mysql3" database="db3" />
	<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
	 <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
	<dataNode	name="jdbc_dn2" dataHost="jdbchost" database="db2" />
	<dataNode name="jdbc_dn3" 	dataHost="jdbchost" database="db3" /> -->
	<dataHost name="mysql1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostS1" url="172.18.0.2:3306" user="root"
				   password="root" />
	</dataHost>
	<dataHost name="mysql2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostS2" url="172.18.0.4:3306" user="root"
				   password="root" />
	</dataHost>
	<dataHost name="mysql3" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostS3" url="172.18.0.6:3306" user="root"
				   password="root" />
	</dataHost>
</mycat:schema>

docker-compose文件的编写

version: '2'
services:
  mycat-01:
   image: centos-jdk8-mycat1.6
   networks:
       dcynet:
         ipv4_address: 172.18.0.10
   volumes:
     - /home/mycat-server/mycat/logs:/usr/local/mycat/logs
     - /home/mycat-server/schema.xml:/usr/local/mycat/conf/schema.xml
     - /home/mycat-server/wrapper.conf:/usr/local/mycat/conf/wrapper.conf
   ports:
     - "8066:8066"
     - "9066:9066"
  mycat-02:
   image: centos-jdk8-mycat1.6
   networks:
       dcynet:
         ipv4_address: 172.18.0.11
   volumes:
     - /home/mycat-server/mycat/logs:/usr/local/mycat/logs
     - /home/mycat-server/schema.xml:/usr/local/mycat/conf/schema.xml
     - /home/mycat-server/wrapper.conf:/usr/local/mycat/conf/wrapper.conf  #可以不加
   ports:
     - "8076:8066"
     - "9076:9066"
  mysql-01:
   image: mysql:5.7
   networks:
       dcynet:
         ipv4_address: 172.18.0.2
   volumes:
     - /home/mysql-01:/var/lib/mysql
   ports:
     - "3307:3306"
   environment:
     - MYSQL_ROOT_PASSWORD=root
  mysql-02:
   image: mysql:5.7
   networks:
       dcynet:
         ipv4_address: 172.18.0.4
   volumes:
     - /home/mysql-02:/var/lib/mysql
   ports:
     - "3308:3306"
   environment:
     - MYSQL_ROOT_PASSWORD=root
  mysql-03:
   image: mysql:5.7
   networks:
       dcynet:
         ipv4_address: 172.18.0.6
   volumes:
     - /home/mysql-03:/var/lib/mysql
   ports:
     - "3309:3306"
   environment:
     - MYSQL_ROOT_PASSWORD=root
networks:
  dcynet:
    driver: bridge
    ipam:
      driver: default
      config:
      - subnet: 172.18.0.0/16

wrapper.conf 下面插入一下信息(可以不加)


wrapper.startup.timeout=300 //超时时间300秒 
wrapper.ping.timeout=120
configuration.directory.in.classpath.first=conf

docker-compose 扩展学习

安装:

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose -v

常用命令

常用命令:
2.compose以守护进程模式运行加-d选项
docker-compose up -d
4.查看compose日志
docker-compose logs web
docker-compose logs redis
5.停止compose服务
docker-compose stop
docker-compose ps
6.重启compose服务
docker-compose restart
7.kill compose服务
docker-compose kill
8.删除compose服务
docker-compose rm

手动创建数据库

对应db1、db2、db3
在这里插入图片描述

启动服务

docker-compose up -d

截图

在这里插入图片描述
mycat-02 我这是关闭状态不用管

现在已经可以用数据库工具连接了
在这里插入图片描述
在这里插入图片描述
创建表工具
在任何一个mycat 下运行下面语句
可以看到 对应的mysql数据库都会有表结构

create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);

此时在运行sql

insert into travelrecord(id,user_id,traveldate,fee,days)  values(1,'Victor',20160101,100,10);
insert into travelrecord(id,user_id,traveldate,fee,days)  values(5000001,'Job',20160102,100,10);
insert into travelrecord(id,user_id,traveldate,fee,days)  values(10000001,'Slow',20160103,100,10);

可以看到对应mysql数据库信息
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

此时说明 mycat分库分表已经完成了

下面在说下 高可用

安装haproxy

环境:

服务名docker-ip地址docker-keepalived-vip-ip
mycat-01172.18.0.10
mycat-02172.18.0.11
mysql-01172.18.0.2
mysql-02172.18.0.4
mysql-03172.18.0.6
haproxy-01docker-ip自动分配 未指定ip172.18.0.15
haproxy-02docker-ip自动分配 未指定ip172.18.0.15

宿主机ip 192.168.136.131
宿主机keepalived虚拟网络192.168.136.140

  1. 下载docker镜像
    docker pull haproxy:1.7
  2. 配置haproxy 配置文件 文件名haproxy.cfg
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 172.18.0.10:8066 check weight 1 maxconn 2000 
        server mycat_02 172.18.0.11:8066 check weight 1 maxconn 2000 
	# 使用keepalive检测死链
        option tcpka
  1. 启动haproxy 容器
    创建卷
    此时haproxy目录下 需有配置文件 复制两份即可
    -v /home/mycat-server/haproxy01:/usr/local/etc/haproxy
    -v /home/mycat-server/haproxy02:/usr/local/etc/haproxy
docker run -d -p 4001:8888 -p 9000:8066 -v /home/mycat-server/haproxy01:/usr/local/etc/haproxy --name haproxy01 --privileged --net=mycat-server_dcynet haproxy:1.7

docker run -d -p 4002:8888 -p 9001:8066 -v /home/mycat-server/haproxy02:/usr/local/etc/haproxy --name haproxy02 --privileged --net=mycat-server_dcynet haproxy:1.7
  1. 进入docker-haproxy服务
docker exec -it haproxy01 /bin/bash
  1. 启用配置文件(启用完配置文件才算是真的启动了haproxy服务)
    (haproxy01 、haproxy02 都需要执行)
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 退出
exit;
  1. 访问管理页面
    http://对应ip:4001/dbs
    用户名:admin
    密码:admin
    对应上面的配置
    在这里插入图片描述

keepalived搭建

(haproxy01 、haproxy02 都需要执行)
1、进入docker-haproxy服务
docker exec -it haproxy01 /bin/bash

2、更新update,安装keepalived
apt-get update
apt-get install keepalived

3、安装vim 安装ifconfig命令 安装ping
apt-get install net-tools
apt-get install iputils-ping
apt-get install vim

4、新建并写入一个keepalived的配置文件(注意把注释删掉)
vim /etc/keepalived/keepalived.conf

vrrp_instance  VI_1 {
    #定义节点属性
    state  MASTER
	  #定义虚拟网卡
    interface  eth0
	  #定义组vriid
    virtual_router_id  100
	  #定义权重
    priority  100
	  #定义心跳检测时间1秒
    advert_int  1
	  #定义组用户密码
    authentication {
        auth_type  PASS
        auth_pass  123456
    }
	  #定义docker内ip地址,必须要在和haproxy同一个网段
    virtual_ipaddress {
        172.18.0.15
    }
}

5、启动
service keepalived start

宿主机配置keepalived

1、安装keepalived
yum install -y keepalived

2、配置keepalived.conf
位置/etc/keepalived文件夹
宿主机配置信息:

vrrp_instance VI_1 {
    state MASTER
    #这里是宿主机的网卡,可以通过ip a查看当前自己电脑上用的网卡名是哪个
    interface ens33
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        #这里是指定的一个宿主机上的虚拟ip,一定要和宿主机网卡在同一个网段,我的宿主机网卡ip是192.168.1.85,所以指定虚拟ip是给的90
       	192.168.136.140
    }
}

#接受监听数据来源的端口,网页入口使用
virtual_server 192.168.136.140 8888 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    #把接受到的数据转发给docker服务的网段及端口,由于是发给docker服务,所以和docker服务数据要一致
    real_server 172.18.0.15 8888 {
        weight 1
    }
}
 
    #接受数据库数据端口,宿主机数据库端口是3306,所以这里也要和宿主机数据接受端口一致
virtual_server 192.168.136.140 8066 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    #同理转发数据库给服务的端口和ip要求和docker服务中的数据一致
    real_server 172.18.0.15 8066 {
        weight 1
    }
}

3、启动keepalived
service keepalived start
可能会报错
在这里插入图片描述
执行 /bin/systemctl start keepalived.service 即可

4、测试
在这里插入图片描述

5:完成高可用
此时架构
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值