tencent-wechat / phxsql
- среда, 31 августа 2016 г. в 03:14:00
C++
A high availability MySQL cluster that guarantees data consistency between a master and slaves.
PhxSQL是由微信后台团队自主研发的一款服务高可用、数据强一致的分布式数据库服务。该服务基于Percona5.6搭建,目标在于解决MySQL在容灾和数据一致性方面的不足,并大幅简化了MySQL容灾切换的运维操作。
作者:Junchao Chen (junechen@tencent.com), Haochuan Cui (lynncui@tencent.com), Duokai Huang (mariohuang@tencent.com), Ming Chen (mingchen@tencent.com) 和 Sifan Liu (stephenliu@tencent.com)
想了解更多,请扫描右侧二维码关注我们的公众号
项目中包含PhxSQL源代码,源代码编译时所需要的一些第三方库,及可直接在Linux环境下运行的二进制包。其中代码使用到了微信团队自研的另外三个开源项目(phxpaxos,phxrpc,colib)。若需编译源代码,需额外下载,也可以在clone时通过--recurse-submodule获得代码。
phxpaxos项目地址: http://github.com/tencent-wechat/phxpaxos
phxrpc项目地址: http://github.com/tencent-wechat/phxrpc
colib项目地址: http://github.com/tencent-wechat/libco
如果是直接使用二进制包,请跳过这节。
目录名 | |
---|---|
phxsqlproxy | phxsqlproxy模块,负责接入请求。 |
phxbinlogsvr | 负责MySQL binlog数据同步,master管理等。 |
percona | percona5.6.31-77.0的官方源代码 |
phx_percona/plugin/phxsync_phxrpc | percona用于跟phxbinlogsvr同步binlog的插件。 |
phx_percona/plugin/semisync | 因兼容问题,修改了semisync的部分代码,目录内为修改过的文件。 |
third_party/glog | Google Glog 第三方库 |
third_party/leveldb | Google Leveldb 第三方库 |
third_party/protobuf | Google Protobuf 3.0+ 第三方库 |
third_party/phxpaxos | paxos协议库。用于phxbinlogsvr之间同步binlog |
third_party/colib | 协程基础库。phxsqlproxy使用 |
third_party/phxrpc | rpc框架。phxbinlogsvr使用 |
PhxSQL需要用到一些第三方库(glog, leveldb, protobuf, phxpaxos, colib, phxrpc),下载后安装到PhxSQL的third_party目录下或者把安装目录链接到PhxSQL的third_party目录下。
需保证第三方库glog, protobuf在configure时带上-fPIC选项(configure CXXFLAGS=-fPIC),并指定--prefix=当前目录绝对路径。
比如configure CXXFLAGS=-fPIC --prefix=/home/root/phxsql/third_party/glog
.
下载 percona-server-5.6.31-77.0.tar.gz
将percona-server-5.6\_5.6.31-77.0
源代码放到PhxSQL目录下,更名或链接为percona(请注意只能使用percona-server-5.6_5.6.31-77.0版本)
sh autoinstall.sh && make && make install
make package
install
完成后,二进制会生成到PhxSQL
目录下的sbin
目录,运行所需要的相关文件和配置会安装到PhxSQL目录下的install_package
目录。打包二进制运行包会把install_package
进行tar格式的打包,并生成phxsql.tar.gz
。若想更改install
的安装目录,可在sh autoinstall.sh
后加入-prefix=
路径PhxSQL需要在2台或以上的机器集群上运行(建议集群内机器数目n>=3 且 n为奇数)
phxsql.tar.gz
传到集群内的所有机器,对集群内每台机器按以下步骤进行安装
phxsql.tar.gz
phxsql/tools
, 并使用python install.py --help
查看安装参数。(例子:python2.7 install.py -i"your_inner_ip" -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f/tmp/data/
)cd phxsql/sbin
, 执行
./phxbinlogsvr_tools_phxrpc -f InitBinlogSvrMaster -h"ip1,ip2,ip3" -p 17000
(17000为phxbinlogsvr监听的端口)mysql -uroot -h"your_inner_ip" -P$phxsqlproxy_port
进入PhxSQL执行读写操作确认PhxSQL已正常运行test_phxsql.sh port ip1 ip2 ip3
, port
为phxsqlproxy_port
, ip
为集群机器ip
PhxSQL一共有3个配置文件
tools/etc_template/my.cnf
,安装后请修改etc/my.cnf
)Section name | Key name | comment |
---|---|---|
AgentOption | AgentPort | Phxbinlogsvr监听MySQL访问的端口,用于MySQL和binlogsvr之间的通信 |
EventDataDir | Phxbinlogsvr数据存放目录 | |
MaxFileSize | Phxbinlogsvr每个数据文件的大小,数据文件过大会导致启动过慢,数据文件过小会导致文件数过多,单位为B | |
MasterLease | Phxbinlogsv的master租约时间,单位为s | |
CheckPointTime | Phxbinlogsvr会删除CheckPointTime时间前的数据,但如果被删数据中存在其他MySQL还没学到的,则不会删除该部分数据,单位为分钟 | |
MaxDeleteCheckPointFileNum | Phxbinlogsvr删数据时,每次删除的最大文件数 | |
FollowIP | 机器为folloer机器,只负责拉取FollowIP机器上的数据,不参与集群的投票 | |
PaxosOption | PaxosLogPath | Phxbinlogsvr中paxos库的数据目录 |
PaxosPort | Phxbinlogsvr中paxos库的通信端口 | |
PacketMode | Phxbinlogsvr在paxos协议中是否增大包的大小限制, 1为每个包的大小为100m,但超时限制变为1分钟,0 为每个包的大小为50m,超时限制2s起(动态变化) | |
Server | IP | Phxbinlogsvr的监听ip |
Port | Phxbinlogsvr的监听端口 | |
LogFilePath | Phxbinlogsvr的日志目录 | |
LogLevel | Phxbinlogsvr的日志级别 |
Section name | Key name | comment |
---|---|---|
Server | IP | phxsqlproxy的监听ip |
Port | phxsqlproxy的监听端口 | |
QSLogFilePath | phxsqlproxy的日志目录 | |
QSLogLevel | phxsqlproxy的日志级别 |
phxsqlproxy为PhxSQL的接入层,所有的请求均经过phxsqlproxy,再透传给MySQL。
phxsqlproxy提供两个端口进行读写
该端口号为phxsqlproxy.conf配置中的端口号, 用户连接上proxyA的此端口,proxyA会自动把请求路由到Master机器,然后再对Master机器上的MySQL进行操作。
该端口号为读写端口号+1, 用户连接上此端口时,会对本机的MySQL进行操作(但若本机为master,则phxsqlproxy会把请求转发到其他phxsqlproxy的只读端口)。
phxsqlproxy
,然后执行命令mysql -uroot -h$phxsqlproxyip -P$phxsqlproxyport -ppwd
phxsqlproxyip为集群内的任意一台phxsqlproxy的ip
phxsqlproxyport为phxsqlproxy端口(读写/只读)
PhxSQL提供一个工具phxbinlogsvr_tools_phxrpc
来方便管理者对PhxSQL的运营管理。
PhxSQL集群中对MySQL的管理使用两个账号管理员帐号和数据同步账号。管理员账号默认账号密码为("root
",""),数据同步账号默认账号密码为("replica
","replica123
")。账号密码的更改通过工具才执行(工具会直接操作MySQL数据,不需要人工进行MySQL操作)。
phxbinlogsvr_tools -f GetMasterInfoFromGlobal -h <host> -p <port>
功能:集群的master机器ip和超时时间
参数:
phxbinlogsvr_tools -f SetMySqlAdminInfo -h <host> -p <port> -u <admin username> -d <admin pwd> -U <new admin username> -D <new admin pwd>
功能: 设置 PhxSQL管理员账号密码
参数:
phxbinlogsvr_tools -f SetMySqlReplicaInfo -h <host> -p <port> -u <admin username> -d <admin pwd> -U <new replica username> -D <new replica pwd>
功能: 设置PhxSQL同步数据账号密码
参数:
phxbinlogsvr_tools_phxrpc -f GetMemberList -h <host> -p <port>
功能:集群的master机器ip和超时时间
参数:
执行工具命令将机器A移除集群phxbinlogsvr_tools_phxrpc -f RemoveMember -h<host> -p<port> -m <机器A的ip>
执行成功后,机器A将会在一段时间后不在接收数据
phxbinlogsvr_tools -f AddMember -h<host> -p<port> -m <机器A的ip>
在新机器A上安装好PhxSQL
根据 "
初始化PhxSQL
" 步骤安装PhxSQL
set super_read_only = 0; set read_only = 0
;在重装过程中,phxbinlogsvr
可能会拉取集群内其他机器checkpoint
来启动,待checkpoint
拉取结束后,phxbinlogsvr
会自杀(为了确保数据安全),日志中会出现"All sm load state ok, start to exit process"
,此时须重新启动phxbinlogsvr
,启动后会正常运行。
CPU : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz * 24
内存 : 32G
磁盘 : SSD Raid10
Master -> Slave : 3 ~ 4ms
Client -> Master : 4ms
sysbench --oltp-tables-count=10 --oltp-table-size=1000000 --num-threads=500 --max-requests=100000 --report-interval=1 --max-time=200
Client线程数 | 测试集群 | 测试集合 | |||||
---|---|---|---|---|---|---|---|
insert.lua (100%写) | select.lua (0%写) | OLTP.lua (20%写) | |||||
QPS | 耗时 | QPS | 耗时 | QPS | 耗时 | ||
200 | PhxSQL | 5076 | 39.34/56.93 | 46334 | 4.21/5.12 | 25657 | 140.16/186.39 |
200 | MySQL半同步 | 4055 | 49.27/66.64 | 47528 | 4.10/5.00 | 20391 | 176.39/226.76 |
500 | PhxSQL | 8260 | 60.41/83.14 | 105928 | 4.58/5.81 | 46543 | 192.93/242.85 |
500 | MySQL半同步 | 7072 | 70.60/91.72 | 121535 | 4.17/5.08 | 33229 | 270.38/345.84 |
注:耗时分别为测试结果的平均耗时/95%分线耗时,单位ms