有了docker虚拟机,就需要利用平台部署数据库的集群,在实际操作之前介绍下数据库集群的方案和各自的特点。源码:https://github.com/limingios/netFuture/tree/master/mysql-pxc/
单节点的弊病
- 大型互联网程序用户群体庞大,所以架构必须要特殊设计
- 单节点的数据库无法满足性能的要求
案例15年前,高考成绩可以在网上查(河南几十万考生),那时候基本家里都没电脑,都是去网吧白天去网吧也查不了,太慢了,后来半夜通宵有时候可以查到,也就是说白天基本查不了人太多了。晚上看运气。一个数据库的实例1万多人就无法反应了。
- 单节点的数据库没有冗余设计,无法满足高可用
常用的mysql集群设计方案
- Replication
- 速度快
- 弱一致性
- 低价值
- 场景:日志,新闻,帖子
- PXC
- 速度慢
- 强一致性
- 高价值
- 场景:订单,账户,财务
Percona Xtradb Cluster,简称PXC。是基于Galera插件的MySQL集群。相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galera cluster最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。本身galera cluster也是一种多主架构。galera cluster最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证MySQL集群的数据一致性。在PXC里面任何一个节点都是可读可写的。在其他的节点一定是可以读取到这个数据。
- 建议PXC使用PerconaServer(MYSQL的改进版,性能提升很大)
- PXC方案和Replication方案的对比
PXC任意一个节点都可以存在读写的方案,也就是任意一个节点都可以当读或者当写。同步复制。保证强一致性。
Replication方案,主从的方式,他是采用异步的方式。
- PXC的数据强一致性
同步复制,事务在所有节点要提交都提交。要么都不提交
- Replication弱一致性,主要master成功就成功了。返回给调用者。如果slave失败,也没办法。因为已经告诉调用者成功了,调用者获取查询的时候查询不到信息。例如:在淘宝买个东西,付款也成功了,查询订单没信息是不是要骂娘。
(1). 虚拟机vagrant讲述安装的步骤
vagrant up
(2).机器window/mac开通远程登录root用户下
su -
# 密码
vagrant
#设置 PasswordAuthentication yes
vi /etc/ssh/sshd_config
sudo systemctl restart sshd
PXC集群安装介绍
PXC既可以在linux系统安装,也可以在docker上面安装。
- 安装镜像PXC镜像
docker pull percona/percona-xtradb-cluster
#本地安装
docker load /dev/null
apt-get clean
apt-get update
apt-get install vim
vi /etc/apt/sources.list
sources.list 添加下面的内容
deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
- 更新apt源
apt-get clean
apt-get update
apt-get install keepalived
apt-get install vim
- keepalived配置文件
容器内的路径:/etc/keepalived/keepalived.conf
vi /etc/keepalived/keepalived.conf
- VI_1 名称可以自定义
- state MASTER | keepalived的身份(MASTER主服务器,BACKUP备份服务器,不会抢占虚拟机ip)。如果都是主MASTER的话,就会进行互相争抢IP,如果抢到了就是MASTER,另一个就是SLAVE。
- interface网卡,定义一个虚拟IP定义到那个网卡上边。网卡设备的名称。eth0是docker的虚拟网卡,宿主机是可以访问的。
- virtual_router_id 51 | 虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。标识可以是0-255。
- priority 100 | 权重。MASTER权重要高于BACKUP 数字越大优选级越高。可以根据硬件的配置来完成,权重最大的获取抢到的级别越高。
- advert_int 1 | 心跳检测。MASTER与BACKUP节点间同步检查的时间间隔,单位为秒。主备之间必须一致。
- authentication | 主从服务器验证方式。主备必须使用相同的密码才能正常通信。进行心跳检测需要登录到某个主机上边所有有账号密码。
- virtual_ipaddress | 虚拟ip地址,可以设置多个虚拟ip地址,每行一个。根据上边配置的eth0上配置的ip。
- 启动keeplived
容器内启动
service keepalived start
宿主机ping这个ip
ping 172.18.0.201
创建haproxy2容器,并配置与haproxy1相同的环境
因为要保证有2个haproxy 和keepalived,这次就不那么麻烦了。直接对一个镜像里面包括keeplived 和 haproxy。
- 宿主机创建文件
mkdir haproxy/h2
cd haproxy/h2
vi haproxy.cfg
vi keepalived.cfg
- haproxy.cfg
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect 5000
#客户端超时(毫秒)
timeout client 50000
#服务器超时(毫秒)
timeout server 50000
#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:abc123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
- keepalived.cfg
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
- docker的方式一下安装好 haproxy 和keepalived
https://hub.docker.com/r/pelin/haproxy-keepalived/ 映射端口更改为4003 4004 name修改h2
docker run -it -d --privileged -p 4003:8888\
-p 4004:3306 \
-v /root/haproxy/h2/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
-v /root/haproxy/h2/keepalived.conf:/etc/keepalived/keepalived.conf \
--name haproxy-keepalived \
--net=net1 \
--name h2 \
--ip 172.18.0.8 \
pelin/haproxy-keepalived
宿主机安装keepalived
yum -y install keepalived
vi /etc/keepalived/keepalived.conf
#删除这个表里之前存在的内容
- keepalived.cof
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.66.200
}
}
virtual_server 192.168.66.200 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 192.168.66.200 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
- 启动宿主机
service keepalived start
虚拟机端口转发 外部无法访问
WARNING: IPv4 forwarding is disabled. Networking will not work.
- 解决方案
宿主机修改
vi /etc/sysctl.conf
# 添加net.ipv4.ip_forward=1
systemctl restart network
PS:如果通过docker的方式直接拉取haproxy和keepalived镜像,比直接在镜像里面安装应用方便很多,建议各位老铁尽量避免在容器内安装应用,这样真心麻烦不爽,别人封装的镜像根据pull的量好好看看api就可以使用了。像h1如果容器stop后,重新start,还需要进入容器把keeplived给起起来。而h2直接start里面的haproxy和keeplived,同时都起起来了。 两个容器的采用的热备的方案,让用户毫无感知,切换ip的形式真是美滋滋。mysql集群的高性能,高负载,高可用基本完成了,可用按照这个思路搭建不同的主机下。
作者:IT人故事会 链接:https://www.jianshu.com/p/c623713a532c 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。