首页 > > > EcoX-PostgreSQL高可用集群最佳实践
作者简介
何敏,目前服务于成都文武信息技术有限公司,有丰富的开发和运维经验。参与开发公司的PostgreSQL高可用系统EcoX、RDS系统,对PostgreSQL高可用系统有非常深入的了解。服务过银行、保险、电力等行业客户。
EcoX数据库高可用集群管理系统软件,该软件包含数据库高可用、读写分离、负载均衡、连接池等功能,能够保证业务7*24小时连续运行,保护业务最大可用性。其特点如下:
l 基于可靠的ZAB协议传递消息和控制指令,确保系统准确无误运行和执行指定的命令。
l 采用集群仲裁机制,防止单点故障和误操作。
l 单套ECOX集群能够管理成百上千个PostgreSQL集群,帮助企业和运维人员提高效率,简化运维难度。
EcoX高可用方案由三个部分组成:分布式应用一致性服务软件仲裁集群、EcoX高可用集群管理软件、PostgreSQL数据库/集群:
l 仲裁集群:主要作用是观察者,判断PG集群是否有故障;采用集群是为了避免观察者本身的单点故障。
l PostgreSQL数据库集群:PG本身的概念,不多做介绍。
l ECOX集群:主要保护PG集群的高可用和节点角色切换,异步模式尽可能保证无数据丢失(同步复制不存在此情况)。
仲裁集群安装过程比较简单,需要注意myid的配置。如果启动失败,查看是否不是防火墙的问题。
仲裁集群最好是独立于数据库集群安装,推荐5节点集群,最低要求3个节点。
节点仅安装软件,不需要初始化数据库。
在所有的数据库节点都需要安装EcoX高可用关系软件,本示例中采用三台服务器作为PostgreSQL数据库节点,分别是:10.9.5.21,10.9.5.22,10.9.5.24,因此在这几个服务器上需要安装EcoX。
从成都文武信息技术有限公司官网下载EcoX安装包:http://w3.ww-it.cn/Fileud/lists/cate_id/30
将安装包拷贝到每台数据库服务器,使用rpm执行安装,默认安装到/usr/EcoX:
rpm -ivh EcoX-5.12.2-1.el6.x86_64.rpm
设置环境变量:
export PATH=/usr/EcoX/bin:$PATH
export LD_LIBRARY_PATH=/usr/EcoX/lib:$LD_LIBRARY_PATH
添加postgres到sudoer中:
[root@cent634 ~]# sudo echo " postgres ALL=(ALL) NOPASSWD: ALL " >> /etc/sudoers
修改每台数据库服务器上的EcoX配置文件:/usr/EcoX/etc/EcoX.conf,配置文件的内容如下:
[root@pg22 etc]# cat ecox.conf
cluster=cluster_name
#init_role=comaster
pgcomaster_num=2
#auto_promote_slave=false
#auto_promote_slave=true
#async_replication=yes
zkhost=10.9.5.20:4119,10.9.5.21:4119,10.9.5.22:4119,10.9.5.24:4119,10.9.5.35:4119,10.9.5.36:4119
zktimeout=20000
pghost=10.9.5.20
pgbin=/usr/pgsql-10/bin
pgport=5433
pgdata=/var/lib/pgsql/10/data
pgclient_net=10.9.0.0/16
pgcluster_net=10.9.0.0/16
#do_not_use_vip=true
eth_port=eth0
virtual_ip=10.9.5.200
netmask=255.255.255.0
do_not_use_comaster_vip=true
comaster_eth_port=eth0
comaster_virtual_ip=10.9.5.201
comaster_netmask=255.255.255.0
|
EcoX is PostgreSQL cluster management software Usage: EcoX [OPTION]...
Options: --help/-h show help message --version show current EcoX version --start start current EcoX postgreSQL node --stop stop current node --show node show current node's status --show cluster show current node's status --clean/-c clear all the zookeeper data of the cluster which this node in --free free the current lock on cluster --rewind execute pg_rewind, resync old master from the current master --restart database restart postgreSQL without change node role --status check the master node is ready, if so the cluster can be use
Copyright reserved, Chengdu WenWu Information Technology Co.,Ltd. support: db_support@ww-it.cn | web: w3.ww-it.cn |
直接使用ecox start即可初始化集群,在ecox启动过程中,如果发现集群未初始化,就会先进行初始化,并对部分数据库参数进行优化,最后再启动数据库、启动EcoX。
1)在主节点10.9.5.21上执行ecox start,会先initdb:
|
-bash-4.1$ ecox start Initial log system success, priority is 600 PostgreSQL 10.1 is compatible The files belonging to this database system will be owned by user "postgres". This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8". The default text search configuration will be set to "english".
Data page checksums are enabled.
fixing permissions on existing directory /var/lib/pgsql/10/data ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok
Waiting for database starting .... done database start success |
2)在从节点10.9.5.22、10.9.5.24上分别执行ecox start,第一次会等待主节点上线,并从主节点上拉取基础备份过来,自动配置流复制参数,再启动PostgreSQL数据库:
|
-bash-4.1$ ecox start Initial log system success, priority is 600 PostgreSQL 10.1 is compatible -bash-4.1$ Begin wait for master online ... Begin wait for node0000000000 online ... Waiting for database starting .... done database start success |
使用ecox show node查看本节点EcoX状态。
1)查看主节点10.9.5.21 EcoX状态:
|
-bash-4.1$ ecox show node EcoX status: running Node name : node0000000000 Node role : master |
2)查看从节点10.9.5.22 EcoX状态:
|
-bash-4.1$ ecox show node EcoX status: running Node name : node0000000001 Node role : comaster |
3)查看节点10.9.5.24 EcoX状态:
|
-bash-4.1$ ecox show node EcoX status: running Node name : node0000000002 Node role : slave |
在任意节点上使用ecox show cluster查看集群状态:
|
-bash-4.1$ ecox show cluster init cluster instance success PostgreSQL 10.1 is compatible node name : ip address | port | online --------------------------------------------------------- node0000000000: 10.9.5.21 | 5410 | TRUE node0000000001: 10.9.5.22 | 5410 | TRUE node0000000002: 10.9.5.24 | 5410 | TRUE master : node0000000000 comaster 1: node0000000001 last master: node0000000000 sync replication :node0000000001 |
当前集群中node0000000000:10.9.5.21是主节点,手动停止EcoX,模拟数据库掉线:
|
1)切换前集群状态,node0000000000为主节点: -bash-4.1$ ecox show cluster init cluster instance success PostgreSQL 10.1 is compatible node name : ip address | port | online --------------------------------------------------------- node0000000000: 10.9.5.21 | 5410 | TRUE node0000000001: 10.9.5.22 | 5410 | TRUE node0000000002: 10.9.5.24 | 5410 | TRUE master : node0000000000 comaster 1: node0000000001 last master: node0000000000 sync replication :node0000000001 -bash-4.1$ -bash-4.1$ 2)找到EcoX进程PID并杀掉进程: -bash-4.1$ ps -ef|grep EcoX postgres 8188 1 0 14:21 pts/1 00:00:00 /usr/EcoX/bin/EcoX --start postgres 8794 3411 0 14:24 pts/1 00:00:00 grep EcoX -bash-4.1$ kill 8188 waiting for server to shut down.... done server stopped stop database success system shutdown success pg_ctl: PID file "/var/lib/pgsql/10/data/postmaster.pid" does not exist Is server running? -bash-4.1$ ps -ef|grep EcoX postgres 8894 3411 0 14:29 pts/1 00:00:00 grep EcoX -bash-4.1$ ps -ef|grep postgres postgres 6963 16794 0 11:49 pts/0 00:00:00 ps -ef postgres 6964 16794 0 11:49 pts/0 00:00:00 grep postgres root 16793 16575 0 Apr28 pts/0 00:00:00 su - postgres postgres 16794 16793 0 Apr28 pts/0 00:00:00 -bash |
可以看到通过杀掉EcoX进程,不但杀掉了EcoX,同时,EcoX也会停止该节点的PostgreSQL数据库。
当10.9.5.21的EcoX掉线后,10.9.5.22、10.9.5.24节点上的EcoX会收到该掉线消息,并选举出新的主节点,从下面cluster信息可以看到node0000000001,即10.9.5.22选举为新的主节点:
|
-bash-4.1$ ecox show cluster init cluster instance success PostgreSQL 10.1 is compatible node name : ip address | port | online --------------------------------------------------------- node0000000000: 10.9.5.21 | 5410 | FALSE node0000000001: 10.9.5.22 | 5410 | TRUE node0000000002: 10.9.5.24 | 5410 | TRUE master : node0000000001 comaster 1: node0000000002 last master: node0000000001 sync replication :node0000000002 |
掉线的主节点,通过ecox start可以重新加入集群。但集群中已经有了主节点和从节点(实验环境配置文件中从节点个数配置为1),因此重新加入集群时,只能充当slave节点。且EcoX会自动探测该掉线主节点是否发生日志分支,并进行修复:
|
-bash-4.1$ ecox start Initial log system success, priority is 600 PostgreSQL 10.1 is compatible -bash-4.1$ Begin wait for node0000000001 online ... begin to sync date from 10.9.5.22... execute cmd:/usr/pgsql-10/bin/pg_rewind --target-pgdata='/var/lib/pgsql/10/data' --source-server='host=10.9.5.22 port=5410 connected to server control file size is: 8192 servers diverged at WAL location 0/3000258 on timeline 1 no rewind required Waiting for database starting .... done database start success
-bash-4.1$ ecox show node EcoX status: running Node name : node0000000000 Node role : slave -bash-4.1$ -bash-4.1$ ecox show cluster init cluster instance success PostgreSQL 10.1 is compatible node name : ip address | port | online --------------------------------------------------------- node0000000000: 10.9.5.21 | 5410 | TRUE node0000000001: 10.9.5.22 | 5410 | TRUE node0000000002: 10.9.5.24 | 5410 | TRUE master : node0000000001 comaster 1: node0000000002 last master: node0000000001 sync replication :node0000000002 |
手动停止从节点的PostgreSQL数据库,看slave节点是否被提升为新的从节点。
从上面可以看到10.9.5.24是从节点,我们到从节点上杀掉数据库进程,可以看到数据库停止了,EcoX也停止了:
|
-bash-4.1$ ecox show node EcoX status: running Node name : node0000000002 Node role : comaster -bash-4.1$ ps -ef|grep postgres postgres 16080 1 0 14:21 pts/0 00:00:04 /usr/EcoX/bin/EcoX --start root 16793 16575 0 Apr28 pts/0 00:00:00 su - postgres postgres 16794 16793 0 Apr28 pts/0 00:00:00 -bash postgres 16920 16080 0 14:25 pts/0 00:00:01 /usr/pgsql-10/bin/postgres -D /var/lib/pgsql/10/data postgres 16921 16920 0 14:25 ? 00:00:00 postgres: logger process postgres 16922 16920 0 14:25 ? 00:00:00 postgres: startup process recovering 000000020000000000000003 postgres 16923 16920 0 14:25 ? 00:00:00 postgres: checkpointer process postgres 16924 16920 0 14:25 ? 00:00:00 postgres: writer process postgres 16925 16920 0 14:25 ? 00:00:00 postgres: stats collector process postgres 16926 16920 0 14:25 ? 00:00:01 postgres: wal receiver process postgres 19230 16920 0 14:34 ? 00:00:00 postgres: wal sender process postgres 10.9.5.21(22818) streaming 0/3000368 postgres 31556 16794 0 15:25 pts/0 00:00:00 ps -ef postgres 31557 16794 0 15:25 pts/0 00:00:00 grep postgres -bash-4.1$ kill 16920 -bash-4.1$ ps -ef|grep postgres root 16793 16575 0 Apr28 pts/0 00:00:00 su - postgres postgres 16794 16793 0 Apr28 pts/0 00:00:00 -bash postgres 31593 16794 0 15:25 pts/0 00:00:00 ps -ef postgres 31594 16794 0 15:25 pts/0 00:00:00 grep postgres -bash-4.1$ ecox show node EcoX status: stop Node name : node0000000002 Node role : comaster |
可以看到刚刚上线的10.9.5.21节点从slave角色变为了comaster,且和主节点保持同步复制模式:
|
-bash-4.1$ ecox show cluster init cluster instance success PostgreSQL 10.1 is compatible node name : ip address | port | online --------------------------------------------------------- node0000000000: 10.9.5.21 | 5410 | TRUE node0000000001: 10.9.5.22 | 5410 | TRUE node0000000002: 10.9.5.24 | 5410 | FALSE master : node0000000001 comaster 1: node0000000000 last master: node0000000001 sync replication :node0000000000 |
在刚刚掉线的节点10.9.5.24上执行ecox start,可以看到该节点加入到集群,角色变为了slave:
|
-bash-4.1$ ecox start Initial log system success, priority is 600 PostgreSQL 10.1 is compatible -bash-4.1$ Waiting for database starting .... done database start success
-bash-4.1$ ecox show cluster init cluster instance success PostgreSQL 10.1 is compatible node name : ip address | port | online --------------------------------------------------------- node0000000000: 10.9.5.21 | 5410 | TRUE node0000000001: 10.9.5.22 | 5410 | TRUE node0000000002: 10.9.5.24 | 5410 | TRUE master : node0000000001 comaster 1: node0000000000 last master: node0000000001 sync replication :node0000000000
-bash-4.1$ ecox show node EcoX status: running Node name : node0000000002 Node role : slave |
EcoX高可用集群软件安装部署和使用都很方便,且不用用户手动配置流复制过程,EcoX自己会拉取备份、修改配置文件、启动集群。
EcoX能够立即发现PostgreSQL集群中故障节点,并迅速选举出新的节点顶替故障节点的角色。主节点掉线,从节点中sync节点会被竞选为新的主节点,主节点的VIP等资源会迁移到新的主节点上。从节点掉线,会从slave节点中选取出WAL LSN最大的节点为新的从节点,从节点的VIP会迁移到新的从节点上。
EcoX还有很多高级特色功能,例如:可以设置节点角色、节点VIP是否启用、可设置从节点个数、重启数据库、自动优化数据库配置文件等等,这里就不一一体验了,感兴趣的朋友可以到成都文武信息技术有限公司的官网下载EcoX全套资料进行了解和使用,
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917105/viewspace-3157961/ ,如需转载,请注明出处,否则将追究法律责任。