PhxSQL使用及部署——替换druid metadata使用的mysql

PhxSQL是一个兼容MySQL、服务高可用、数据强一致的关系型数据库集群。PhxSQL以单Master多Slave方式部署,在集群内超过一半机器存活的情况下,可自身实现自动Master切换,且保证数据一致性。

Github地址:https://github.com/tencent-wechat/phxsql/blob/master/README.zh_cn.md

总览

  • PhxSQL具有服务高可用、数据强一致、高性能、运维简单、和MySQL完全兼容的特点。
  • 服务高可用:PhxSQL集群内只要多数派节点存活就能正常提供服务;出于性能的考虑,集群会选举出一个Master节点负责写入操作;当Master失效,会自动重新选举新的Master。
  • 数据强一致:PhxSQL采用多节点冗余部署,在多个节点之间采用paxos协议同步流水,保证了集群内各节点数据的强一致。
  • 高性能:PhxSQL比MySQL SemiSync的写性能更好,得益于Paxos协议比SemiSync协议更加高效;
  • 运维简单:PhxSQL集群内机器出现短时间故障,能自动恢复数据,无需复杂的运维操作;PhxSQL更提供一键更换(新增/删除)集群内的机器,简化运维的工作。
  • MySQL完全兼容:PhxSQL是基于Percona的研发,完全兼容MySQL的操作命令。 可通过MySQL提供的mysqlclient/perconaserverclient直接操作PhxSQL。

项目中包含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

1. PhxSQL常用命令

目前在BI广州机房druid测试环境中的monitor00(100.0.0.1)、monitor01(100.0.0.2)和monitor02(100.0.0.3)上安装了PhxSQL。因为集群的高一致性,没有特地说明的地方,任选三台中的一台ip即可。

  • 安装路径basedir = /apps/phxsql; 
  • 数据路径datadir = /apps/phxsqldata;
  • 编译后的安装包为 /apps/phxsql-0.8.0.tar.gz

(1). 安装及初始化phxsql

1). 安装
在monitor01上安装,其他机器只需在对应机器的对应目录下更换命令中的ip即可,进入 phxsql /tools
monitor0:  python2.7  install .py -i "100.0.0.1"  -p 50001 -g 6000 -y 3307 -P 17001 -a 9001 -f /apps/phxsqldata
monitor1:  python2.7  install .py -i "100.0.0.2"  -p 50001 -g 6000 -y 3307 -P 17001 -a 9001 -f /apps/phxsqldata
monitor2:  python2.7  install .py -i "100.0.0.3"  -p 50001 -g 6000 -y 3307 -P 17001 -a 9001 -f /apps/phxsqldata
 
 
2). 安装完毕后,检查各台机器上的二进制是否都已经启动
ps  -ef |  grep  phxsqlproxy  检查phxsqlproxy是否启动
ps  -ef |  grep  mysql        检查mysql是否启动
ps  -ef |  grep  phxbinlogsvr 检查phxbinlogsvr是否启动
如果存在没有正常启动的二进制,执行 python2.7 restart.py -p二进制名,启动相应二进制,如python2.7 restart.py -p mysql
 
3). 二进制检查完毕后,执行初始化命令,进入 phxsql /sbin ,任找一台机器
. /phxbinlogsvr_tools_phxrpc  -f InitBinlogSvrMaster -h "IP1,IP2,IP3"  -p 17000
     其中IP1为master, IP2,IP3为slave 当执行完毕且出现add ip IP1 to master  done ,add ip IP2 to master  done ,add ip IP3 to master  done 的信息时,则初始化完成,集群安装成功。初始化过程中出现异常,可选择重新安装并初始化。
     
如: . /phxbinlogsvr_tools_phxrpc  -f InitBinlogSvrMaster -h "100.0.0.1,100.0.0.2,100.0.0.3"  -p 17001
如果出现connect machine IP fail,则该IP下的二进制没有在运行;
如果出现其他异常,而不出现add ip IPXXX to master done,则可认为初始化过程中出现异常,可选择重新安装;
如果出现 machine xxx has been set, 则集群已经被初始化,但IP2,IP3没有加入到集群中。此时可通过成员管理中的添加成员把IP2,IP3加入到集群,或者重新安装。

 

(2). 查看命令及相关参数,进入 phxsql/tools

python 文件名 --help 或者是
python2.7 文件名 --help
如python2.7 install.py --help
optional arguments:
  -i IP_LIST, --ip_list IP_LIST
                        IPs of group hosts, split by ','
  -p PHXSQLPROXY_PORT, --phxsqlproxy_port PHXSQLPROXY_PORT
                        phxsqlproxy for mysql client to connect
  -g AGENT_PORT, --agent_port AGENT_PORT
                        agent for mysql to learn binlog
  -y MYSQL_PORT, --mysql_port MYSQL_PORT
                        mysql port for phxsqlproxy to connect
  -P PHXBINLOGSVR_PORT, --phxbinlogsvr_port PHXBINLOGSVR_PORT
                        phxbinlogsvr port
  -a PAXOS_PORT, --paxos_port PAXOS_PORT
                        port for paxos protocol to communicate
  -s SKIP_DATA, --skip_data SKIP_DATA
                        do not delete datas in data_dir
  -f DATA_DIR, --data_dir DATA_DIR
                        where phxbinlogsvr and paxos log been stored

 

(3). 在保留当前数据库的前提下,重新安装

python2.7  install .py -i "100.0.0.1"  -p 50001 -g 6000 -y 3307 -P 17001 -a 9001 -f /apps/phxsqldata  -s1
-s1表示保留现有数据库

 

(4). 查看集群状态,进如 phxsql/sbin

获取集群成员列表:./phxbinlogsvr_tools_phxrpc -f GetMemberList -h "100.0.0.1"  -p  17001
获得集群的master信息:./phxbinlogsvr_tools_phxrpc -f GetMasterInfoFromGlobal -h "100.0.0.1"  -p  17001

 

(5). PhxSQL运营管理工具phxbinlogsvr_tools_phxrpc,可以用来初始化PhxSQL、获取成员列表等。

进入phxsql/sbin,获取工具说明
./phxbinlogsvr_tools_phxrpc --help

 

(6). 通过Phxsqlproxy登录PhxSQL的命令行客户端

mysql -uroot -hIP1(IP2,IP3) -P  50001
对当前集群来说,由于没有把mysql命令软链接到bin下,所以使用全路径:
用户root:  /apps/phxsql/percona.src/bin/mysql -uroot -h100. 0.0 . 1  -P  50001

 

(7). 增加PhxSQL新用户,即增加管理员

进入phxsql/sbin
./phxbinlogsvr_tools_phxrpc -f SetMySqlAdminInfo -h  100.0 . 0.1  -p  17001  -u root -d  ""  -U druid -D druid

2. PhxSQL编译

(1). 安装依赖库

yum  install  -y readline readline-devel libstdc++-static glibc-static perl-Module-Install.noarch

(2). 中文详细编译手册,按官方文档一步一步编译

(3). 生成安装文件

1). 在PhxSQL目录下执行sh autoinstall.sh && make && make install

2). 若想打包二进制运行包(集群运行时所需要的所有文件和配置)make package

3). install完成后,二进制会生成到PhxSQL目录下的sbin目录,运行所需要的相关文件和配置会安装到PhxSQL目录下的install_package目录。打包二进制运行包会把install_package进行tar格式的打包,并生成phxsql.tar.gz。若想更改install的安装目录,可在sh autoinstall.sh 后加入-prefix=路径

(4). 将安装文件分发到需要安装PhxSQL的机器上,如monitor00、monitor01、monitor02,可用salt分发。

3. PhxSQL部署

PhxSQL需要在2台或以上的机器集群上运行(建议集群内机器数目n>=3 且 n为奇数)。

(1). my.cnf

        MySQL的配置,请根据你的业务需求进行修改(安装前请修改tools/etc_template/my.cnf,安装后请修改etc/my.cnf)。

         安装前将my.cnf中的 user=mysql 改为 user=druid,以免报错“chown: invalid user: `user:mysql’”。

(2). 中文部署手册,按官方步骤一步一步部署

如果安装失败,请查看所需端口是否被占用。

4. PhxSQL成员管理

PhxSQL成员管理官方文档 

5. 迁移数据

(1). 从现有MySQL数据库迁移

从现有MySQL数据库迁移—官方文档

虽然集群之前使用的MySQL(5.6.32)与PhxSQL使用的percona(5.6.31-77.0)都是MySQL5.6,迁移过程中使用如下命令会报错,很可能是兼容性问题。

python2.7  install .py -i "100.0.0.1"  -p 50001 -g 6000 -y 3307 -P 17001 -a 9001 -f /apps/phxsqldata  -s1

 

(2). 导出再导入

将pro环境中的MySQL替换为PhxSQL

1). 导出数据

登录mysql数据库命令行客户端
druid > druid.sql

2). 将druid.sql打包为druid-db-20161222.tar.gz,该文件很大,如果不打包会salt上传失败

3). 分发打包后的sql文件到monitor00

4). 导入PhxSQL数据库

任选一台PhxSQL,进入命令行客户端
create database druid;       // 创建空数据库
set names utf8;              // 设置字符集
/apps/phxsql/percona.src/bin/mysql -uroot -h100.0 .0 . 1  -P  50001  druid < druid.sql    // 导入数据,在一台机器上导入即可
 
// 给druid机器中所有机器赋予权限
GRANT ALL ON druid.* TO  'druid' @ '%'  IDENTIFIED BY  'druid' ;
GRANT ALL ON druid.* TO  'druid' @ 'localhost'  IDENTIFIED BY  'druid' ;
FLUSH PRIVILEGES;

6). 修改druid配置文件中_common/common.runtime.properties

修改common.runtime.properties中的mysql connectURI
# For MySQL:
druid.metadata.storage.type=mysql
druid.metadata.storage.connector.connectURI=jdbc:mysql: //100.0.0.1:3307/druid

7). 重启druid所有服务

附录

微信开源PhxSQL:高可用、强一致的MySQL集群

谈谈PhxSQL的设计和实现哲学(上)

谈谈PhxSQL的设计和实现哲学(下)

官方wiki

你可能感兴趣的:(PhxSQL,Druid)