喵♂呜 的博客

一个刚毕业就当爹的程序猿 正在迷雾中寻找道路...

Slony-I在CentOs下编译安装及使用

Slony-I是PgSql的一个主从同步工具

下载源码并解压

下载源码: wget http://main.slony.info/downloads/2.2/source/slony1-2.2.5.tar.bz2

如果提示无法解析的主机地址 请尝试 wget -4 http://main.slony.info/downloads/2.2/source/slony1-2.2.5.tar.bz2 指定IPV4协议
解压源码: tar -xvf slony1-2.2.5.tar.bz2

编译安装

切换到目录: cd slony1-2.2.5
检查安装环境: ./configure --with-perltools
参数说明:

  • --with-perltools perl脚本工具
  • --with-pgconfigdir=/usr/local/pgsql/bin 一般情况下只要配置了环境变量 这个可以不加

编译并安装: make -j4 && make install 其中-j4代表CPU核心

配置数据库信息

  • 需要进行同步的机器
    • CentOs7.2 IP: 192.168.1.10
    • CentOs7.2 IP: 192.168.1.11
  • 在两台机器的数据库中创建一个名为slony的超级用户用于Slony-I使用
    • create user slony superuser password '123456';
  • 在192.168.1.10上新建一个名为master的数据库 作为数据源
    • create database master;
    • alter database master owner to slony;
  • 在192.168.1.10上新建一个名为slave的数据库 作为目标数据库
    • create database slave;
    • alter database slave owner to slony;
  • 在两台机器的数据库中创建一个测试表synctable
    • create table synctable(id int primary key, content text);
  • 两台数据库相互测试连接
    • 1.11: $ psql -h192.168.1.12 -Uslony -d slave
    • 1.12: $ psql -h192.168.1.11 -Uslony -d master
    • 如果连接有问题
      • 检查数据库监听地址是否为 * 或者目标地址
      • 检查一下 $PGDATA/pg_hba.conf 文件
        • 添加权限 host all all 192.168.1.0/32 md5 (具体看文件)
      • 检查防火墙
        • 如果是firewall 请尝试以下命令 firewall-cmd --zone=public --add-port=5432/tcp --permanentfirewall-cmd --reload
        • 如果是iptables 请尝试下列命令 iptables -A IN_public_allow -p tcp --dport 5432 -j ACCEPT 或者 iptables -A INPUT -p tcp --dport 5432 -j ACCEPT

配置Slony-I

  • 这里我们使用altperl script脚本完成Slony数据同步的配置工作

    • /usr/local/etc下有一个slon_tools.conf-simple的实例文件
    • cd /usr/local/etc
    • 复制一份 su cp slon_tools.conf-simple slon_tools.conf
    • 打开编辑器 vi slon_tools.conf
    • $CLUSTER_NAME = 'slony'; #配置集群名称
    • 配置主节点
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # Include add_node lines for each node in the cluster.  Be sure to
      # use host names that will resolve properly on all nodes
      # (i.e. only use 'localhost' if all nodes are on the same host).
      # Also, note that the user must be a superuser account.
      add_node(node => 1,
      host => '192.168.1.11',
      dbname => 'master',
      port => 5432,
      user => 'slony',
      password => '123456');
    • 配置从节点
      1
      2
      3
      4
      5
      6
      add_node(node     => 2,
      host => '192.168.1.12',
      dbname => 'slave',
      port => 5432,
      user => 'slony',
      password => '123456');
    • 配置需要同步的表和序列(这里是有主键的表) 写入synctable
      1
      2
      3
      4
      # This array contains a list of tables that already have primary keys.
      "pkeyedtables" => [
      'synctable'
      ],
    • 这里是没有主键但是有唯一键的表 这次没用到 暂时注释掉
      1
      2
      3
      4
      5
      # For tables that have unique not null keys, but no primary key, enter their names and indexes here.
      #"keyedtables" => {
      # 'table3' => 'index_on_table3',
      # 'table4' => 'index_on_table4',
      #},
    • 配置同步序列 这次也没用到 注释掉
      1
      2
      3
      4
      # Sequences that need to be replicated should be entered here.
      #"sequences" => ['sequence1',
      # 'sequence2'
      # ],
    • 配置同步序列 这次也没用到 注释掉
      1
      2
      3
      4
      5
      6
      7
      8
      # "set2" => {
      # "set_id" => 2,
      # "table_id" => 6,
      # "sequence_id" => 3,
      # "pkeyedtables" => ["table6"],
      # "keyedtables" => {},
      # "sequences" => [],
      # },
    • 配置完的文件同时复制到 192.168.1.11
      • 这里用scp如果询问yes/no输入yes 然后输入密码
        1
        2
        3
        scp slon_tools.conf 192.168.1.11:`pwd`/.
        Are you sure you want to continue connection (yes/no): yes
        root@192.168.1.11's password:
  • 在 1.10 上初始化群集 执行 slonik_init_cluster | slonik

  • 在 1.10 上启动守护进程 slon_start 1 后面的1是配置群集的 node

  • 在 1.11 上启动守护进程 slon_start 2 后面的2是配置群集的 node

  • 如果提示 Slon failed to start for cluster slony, node node1 并且日志显示 CST FATAL Cannot open pid_file "/var/run/slony1/slony_node1.pid"

    • 在两台机器中创建PID文件夹 mkdir /var/run/slony1
  • 在 1.10 上创建数据集 slonik_create_set 1 | slonik 1 代表同步群集编号

  • 在 1.11 上增加数据订阅者 slonik_subscribe_set 1 2 | slonik 1 代表同步群集编号 2代表节点配置中的 node

测试同步配置

  • 在 1.10 的 master 数据库的 synctable 表中插入一条数据
    • insert into synctable values(1,'同步测试');
  • 在 1.11 的 slave 数据库查询
    • select * from synctable;
      1
      2
      3
          id | content
      -------+----------
      1 | 同步测试
  • 可以看到数据已经同步成功了

欢迎关注我的其它发布渠道