zoukankan      html  css  js  c++  java
  • 私有云Mariadb集群搭建

         MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,

    同时提高系统的负载能力,集群部署是必不可少的。

    MariaDB Galera Cluster 介绍

    MariaDB集群是MariaDB同步多主机集群。它仅支持XtraDB/ InnoDB存储引擎(虽然有对MyISAM实验支持 - 看wsrep_replicate_myisam系统变量)。

    主要功能:

    • 同步复制
    • 真正的multi-master,即所有节点可以同时读写数据库
    • 自动的节点成员控制,失效节点自动被清除
    • 新节点加入数据自动复制
    • 真正的并行复制,行级
    • 用户可以直接连接集群,使用感受上与MySQL完全一致

    优势:

    • 因为是多主,所以不存在Slavelag(延迟)
    • 不存在丢失事务的情况
    • 同时具有读和写的扩展能力
    • 更小的客户端延迟
    • 节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的

    技术:

    Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。

    Galera插件保证集群同步数据,保持数据的一致性,靠的就是可认证的复制

    当客户端发出一个commit的指令,在事务被提交之前,所有对数据库的更改都会被write-set收集起来,并且将 write-set 纪录的内容发送给其他节点。

    write-set 将在每个节点进行认证测试,测试结果决定着节点是否应用write-set更改数据。

    如果认证测试失败,节点将丢弃 write-set ;如果认证测试成功,则事务提交。

    局限性:

          (1).目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的.

          (2).DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.

          (3).在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…

          (4).查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。

          (5).允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。

          (6).由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对 于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).

          (7).XA事务不支持,由于在提交上可能回滚。

          (8).整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

          (9).集群节点建议最少3个。

          (10).如果DDL语句有问题将破坏集群。

     openstack中mariadb的集群是比不可少的 ,是组件当中非常重要的组件

    我是本次选择mysql的版本是mariadb,集群方法是galera cluster多主集群。

    其实也有很多其他方案,如pxc、mha等等,选择galera的原因是安装方便,使用与维护也方便,多主模式任何一个节点挂了都可以在另外节点查看数据,同时openstack各组件也支持配置集群方式的配置

    系统环境:

    # cat /etc/redhat-release 
    CentOS Linux release 7.2.1511 (Core) 
    # uname -r
    3.10.0-327.el7.x86_64

    hosts文件写入

    我这边是搭建在rabbitmq上面进行测试的

    # cat /etc/hosts
    192.168.56.60 rabbitmq01
    192.168.56.61 rabbitmq02
    192.168.56.62 rabbitmq03

    安装基础库(所有节点)

    yum -y install make cmake bc gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel nss_ldap openldap openldap-devel  openldap-clients openldap-servers libxslt-devel libevent-devel ntp  libtool-ltdl bison libtool vim-enhanced tar wget readline-devel libyaml-devel  patch telnet lrzsz sysstat screen parted rsync libselinux-python dmidecode ntpdate sar openssh-clients man

    安装mariadb源(所有节点)

    cat >/etc/yum.repos.d/mariadb.repo <<EOF
    # MariaDB 10.1 CentOS repository list - created 2016-05-24 07:59 UTC
    # http://mariadb.org/mariadb/repositories/
    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.1/centos7-amd64 
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB 
    gpgcheck=1
    EOF

    安装软件(所有节点安装)

    yum install MariaDB-server MariaDB-client -y

    node1节点配置

    # cat /etc/my.cnf.d/server.cnf |grep -v '^#'|sed '/^$/d'
    [server]
    [mysqld]
    collation-server = utf8_general_ci
    init-connect = 'SET NAMES utf8'
    character-set-server = utf8
    skip-name-resolve
    skip-host-cache
    open_files_limit = 65535
    max_connections = 5000
    bind-address=192.168.56.60
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    innodb_file_per_table
    character-set-server = utf8
    [galera]
    wsrep_on=ON
    wsrep_provider=/usr/lib64/galera/libgalera_smm.so
    wsrep_provider_options="pc.recovery=TRUE;gcache.size=300M"
    wsrep_cluster_address='gcomm://'
     
    wsrep_cluster_name='ck-galera'
    wsrep_node_address='192.168.56.60'
    wsrep_node_name='m-1'
    wsrep_sst_method=rsync
    [embedded]
    [mariadb]
    [mariadb-10.1]

    启动

    systemctl enable mariadb
    systemctl start mariadb

    初始化数据库

     mysql_secure_installation
    #过程我就不写了

    查询集群数量

    mysql -uroot -p -e "show status where Variable_name like 'wsrep_cluster_size'"
    password:
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 1     |
    +--------------------+-------+

    查看当前集群ip

    mysql -uroot -p -e "show status where Variable_name like 'wsrep_incoming_addresses'"
    Enter password:
    +--------------------------+-------------------+
    | Variable_name            | Value             |
    +--------------------------+-------------------+
    | wsrep_incoming_addresses | 192.168.56.60:3306 |
    +--------------------------+-------------------+

    node2配置

    # grep -v '^#' /etc/my.cnf.d/server.cnf |sed '/^$/d'
    [server]
    [mysqld]
    collation-server = utf8_general_ci
    init-connect = 'SET NAMES utf8'
    character-set-server = utf8
    skip-name-resolve
    skip-host-cache
    open_files_limit = 65535
    max_connections = 5000
    bind-address=192.168.56.61
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    innodb_file_per_table
    character-set-server = utf8
    [galera]
    wsrep_on=ON
    wsrep_provider=/usr/lib64/galera/libgalera_smm.so
    wsrep_provider_options="pc.recovery=TRUE;gcache.size=300M"
    wsrep_cluster_address='gcomm://192.168.56.60'
    wsrep_cluster_name='ck-galera'
    wsrep_node_address='192.168.56.61'
    wsrep_node_name='m-2'
    wsrep_sst_method=rsync
    [embedded]
    [mariadb]
    [mariadb-10.1]

    启动

    systemctl enable mariadb
    systemctl start mariadb

    查看集群数量

    # mysql -uroot -p -e "show status where Variable_name like 'wsrep_cluster_size'"
    Enter password: 
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 2     |
    +--------------------+-------+

    查看集群ip

    # mysql -uroot -p -e "show status where Variable_name like 'wsrep_incoming_addresses'"
    Enter password: 
    +--------------------------+---------------------------------------+
    | Variable_name            | Value                                 |
    +--------------------------+---------------------------------------+
    | wsrep_incoming_addresses | 192.168.56.60:3306,192.168.56.61:3306 |
    +--------------------------+---------------------------------------+

    可以看到node1和node2在里面了

    node3配置

    修改跟node1与node2一样

    # grep -v '^#' /etc/my.cnf.d/server.cnf |sed '/^$/d'
    [server]
    [mysqld]
    collation-server = utf8_general_ci
    init-connect = 'SET NAMES utf8'
    character-set-server = utf8
    skip-name-resolve
    skip-host-cache
    open_files_limit = 65535
    max_connections = 5000
    bind-address=192.168.56.62
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    innodb_file_per_table
    character-set-server = utf8
    [galera]
    wsrep_on=ON
    wsrep_provider=/usr/lib64/galera/libgalera_smm.so
    wsrep_provider_options="pc.recovery=TRUE;gcache.size=300M"
    wsrep_cluster_address='gcomm://192.168.56.60,192.168.56.61'
    wsrep_cluster_name='ck-galera'
    wsrep_node_address='192.168.56.62'
    wsrep_node_name='m-3'
    wsrep_sst_method=rsync
    [embedded]
    [mariadb]
    [mariadb-10.1]

    启动

    systemctl enable mariadb
    systemctl start mariadb

    查看集群状态

    # mysql -uroot -p -e "show status where Variable_name like 'wsrep_cluster_size'"
    Enter password: 
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+

    查看集群IP

    # mysql -uroot -p -e "show status where Variable_name like 'wsrep_incoming_addresses'"
    Enter password: 
    +--------------------------+----------------------------------------------------------+
    | Variable_name            | Value                                                    |
    +--------------------------+----------------------------------------------------------+
    | wsrep_incoming_addresses | 192.168.56.60:3306,192.168.56.62:3306,192.168.56.61:3306 |
    +--------------------------+----------------------------------------------------------+

    可以看到3个节点都在里面了。

    下一步大家如果想测试,可以在任意一个节点里创建数据库与表,插入数据后,在另外节点里查看是否有对应信息

  • 相关阅读:
    Jupyter notebook 读取文件的问题
    机器学习-数据清洗和特征选择
    机器学习-逻辑回归
    Java教程
    13.并发编程
    redis 实现
    CyclicBarrier介绍
    Future模式衍生出来的更高级的应用
    并发编程 futuretask
    整理POST请求方式
  • 原文地址:https://www.cnblogs.com/yexiaochong/p/6169407.html
Copyright © 2011-2022 走看看