设为首页 收藏本站
查看: 1372|回复: 0

[经验分享] MYSQL 的集群

[复制链接]

尚未签到

发表于 2018-10-6 13:16:37 | 显示全部楼层 |阅读模式
  核心架构


  • MySQL 5.7 引入了 Group Replication 功能,可以在一组 MySQL 服务器之间实现自动主机选举,形成一主多从结构。经过高级配置后,可以实现多主多从结构。
  • MySQL Router 是一个轻量级透明中间件,可以自动获取上述集群的状态,规划 SQL 语句,分配到合理的 MySQL 后端进行执行。
  • MySQL Shell 是一个同时支持 JavaScript 和 SQL 的交互程序,可以快速配置 InnoDB Cluster。  MySQL InnoDB Cluser  |  Mysql 5.7 集群

  部署
  本次共3台机器,设置主机名及hosts | 配置每台服务 my.cnf 中report_host 字段,为自己的 hostname
  192.168.10.123 db1
  192.168.10.124 db2
  192.168.10.125 db3
  安装 mysql5.7.20 ,可以参考下面的安装基本,我搭建的时候就是用的这个。
  http://blog.51cto.com/hequan/1982428
  安装mysql-shell mysql-route
  wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
  yum install mysql57-community-release-el7-11.noarch.rpm
  yum install  mysql-shell  -y
  yum install  mysql-router  -y
  设置相关用户的权限,生产环境 可以不是 root用户

  grant all   privileges  on .  to 'root'@'%' >  GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata. TO root@'%' WITH GRANT OPTION;

  GRANT>  CREATE USER ON . TO root@'%' WITH GRANT OPTION;
  GRANT SELECT ON .* TO root@'%' WITH GRANT OPTION;
  flush privileges;
  mysqlsh
  [root@db1 ~]#  mysqlsh

检查mysql 配置文件   (3台主机都要操作此步骤)
  dba.checkInstanceConfiguration('root@db1:3306')
  +----------------------------------+---------------+----------------+--------------------------------------------------+
  | Variable                         | Current Value | Required Value | Note                                             |
  +----------------------------------+---------------+----------------+--------------------------------------------------+
  | binlog_checksum                  | CRC32         | NONE           | Update the server variable or restart the server |
  | binlog_format                    | MIXED         | ROW            | Update the server variable or restart the server |
  | enforce_gtid_consistency         | OFF           | ON             | Restart the server                               |
  | gtid_mode                        | OFF           | ON             | Restart the server                               |
  | log_slave_updates                | 0             | ON             | Restart the server                               |
  | master_info_repository           | FILE          | TABLE          | Restart the server                               |

  |>  | transaction_write_set_extraction | OFF           | XXHASH64       | Restart the server                               |
  +----------------------------------+---------------+----------------+--------------------------------------------------+

修复mysql 配置文件,    必须用 root(3台主机都要操作此步骤)
  dba.configureLocalInstance('root@db1:3306')
  Please provide the password for 'root@db1:3306':
  Detecting the configuration file...
  Found configuration file at standard location: /etc/my.cnf
  Do you want to modify this file? [Y|n]:  [Y|n]: Y

重启mysql

重新检查  (3台主机都要操作此步骤)
  dba.checkInstanceConfiguration('root@db1:3306')
  Please provide the password for 'root@db1:3306':
  Validating instance...
  The instance 'db1:3306' is valid for Cluster usage
  {
  "status": "ok"
  }

登陆
  mysqlsh --uri root@db1:3306

创建集群     main
  mysql-js> var cluster = dba.createCluster('main')
  A new InnoDB cluster will be created on instance 'hequan@db1:3306'.
  Creating InnoDB cluster 'main' on 'hequan@db1:3306'...
  Adding Seed Instance...
  Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
  At least 3 instances are needed for the cluster to be able to withstand up to
  one server failure.

添加子节点
  mysql-js> cluster.addInstance('root@db2:3306')
  mysql-js> cluster.addInstance('root@db3:3306')

查看节点信息
  mysql-js> cluster.status()

将配置 持久化,写入到  my.cnf
  mysql-js>  \connect db1
  mysql-js> dba.configureLocalInstance('db1:3306')

查看基本信息
  mysql-js>  cluster.describe();

退出之后,再查看节点信息
  var cluster = dba.getCluster();
  cluster.status();
  Mysql-route 设置

此命令会更新 /etc/mysqlrouter/mysqlrouter.conf 中的配置信息, 可以是别的机器 这里选择的为db2
  [root@db2 ~]# mysqlrouter --bootstrap root@db1:3306 --user mysqlrouter
  Please enter MySQL password for root:
  WARNING: The MySQL server does not have SSL configured and metadata used by the router may be transmitted unencrypted.
  Bootstrapping system MySQL Router instance...
  MySQL Router  has now been configured for the InnoDB cluster 'main'.
  The following connection information can be used to connect to the cluster.
  Classic MySQL protocol connections to cluster 'main':


  • Read/Write Connections: localhost:6446    读写
  • Read/Only Connections: localhost:6447     只读
  X protocol connections to cluster 'main':


  • Read/Write Connections: localhost:64460
  • Read/Only Connections: localhost:64470
  Existing configurations backed up to /etc/mysqlrouter/mysqlrouter.conf.bak
  [root@db2 ~]# systemctl start mysqlrouter

启动
  systemctl start mysqlrouter
  systemctl enable mysqlrouter

查看端口
  [root@db2 ~]# netstat -lntup
  Active Internet connections (only servers)
  Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
  tcp        0      0 0.0.0.0:64460           0.0.0.0:               LISTEN      2958/mysqlrouter   
  tcp        0      0 0.0.0.0:6446            0.0.0.0:               LISTEN      2958/mysqlrouter
  tcp        0      0 0.0.0.0:6447            0.0.0.0:               LISTEN      2958/mysqlrouter   
  tcp        0      0 0.0.0.0:64470           0.0.0.0:               LISTEN      2958/mysqlrouter

验证
  mysql -u root -h 127.0.0.1 -P 6446 -p
  select @@port;
  select @@hostname;
  故障模拟
  ##关闭 db1 数据库,自动切换如下:
  "topology": {
  "db1:3306": {
  "address": "db1:3306",
  "mode": "R/O",
  "readReplicas": {},
  "role": "HA",
  "status": "(MISSING)"
  },
  "db2:3306": {
  "address": "db2:3306",
  "mode": "R/W",
  "readReplicas": {},
  "role": "HA",
  "status": "ONLINE"
  },
  "db3:3306": {
  "address": "db3:3306",
  "mode": "R/O",
  "readReplicas": {},
  "role": "HA",
  "status": "ONLINE"
  }
  ##重启db2 ,执行命令
  mysql> show databases;
  ERROR 2013 (HY000): Lost connection to MySQL server during query
  mysql> show databases;
  ERROR 2006 (HY000): MySQL server has gone away
  No connection. Trying to reconnect...

  Connection>  Current database: NONE
  mysql> select @@hostname;
  +------------+
  | @@hostname |
  +------------+
  | db1        |
  +------------+
  ##重启节点后,需要手动加入
  "db2:3306": {
  "address": "db2:3306",
  "mode": "R/O",
  "readReplicas": {},
  "role": "HA",
  "status": "(MISSING)"
  cluster.rejoinInstance('root@db2:3306')
  The instance 'db2:3306' was successfully added to the MySQL Cluster.

所有节点都重启了,重新加入
  mysqlsh --uri root@db1:3306
  mysql-js> var cluster = dba.rebootClusterFromCompleteOutage();
  Reconfiguring the default cluster from complete outage...
  The instance 'db2:3306' was part of the cluster configuration.
  Would you like to rejoin it to the cluster? [y|N]: y
  The instance 'db3:3306' was part of the cluster configuration.
  Would you like to rejoin it to the cluster? [y|N]: y
  The cluster was successfully rebooted.
  报错总结:
  ##如果节点在加入集群前,执行了写操作,加入集群时会报错
  ERROR: Error joining instance to cluster: 'db2:3306' - Query failed. MySQL Error (3092): The server is not configured properly to be an active member of the group. Please see more details on error log.. Query: START group_replication (RuntimeError)
  ##登陆 db2 数据库 执行 reset master;

如果出现了   "status": "NO_QUORUM"     执行修复,重新加入

暂未测试
  cluster.forceQuorumUsingPartitionOf("db1:3306")
  mysql-js> cluster.rejoinInstance('root@db2:3306')
  mysql-js> cluster.rejoinInstance('root@db3:3306')
  附言:
  官方文档: https://dev.mysql.com/doc/refman/5.7/en/mysql-innodb-cluster-userguide.html
  节点有哪状态
  

* ONLINE  - 节点状态正常。  
* OFFLINE  -   实例在运行,但没有加入任何Cluster。
  
* RECOVERING - 实例已加入Cluster,正在同步数据。
  
* ERROR  -  同步数据发生异常。
  
* UNREACHABLE -  与其他节点通讯中断,可能是网络问题,可能是节点crash。
  
* MISSING 节点已加入集群,但未启动group replication
  

  集群有哪些状态
  

* OK – 所有节点处于online状态,有冗余节点。  
* OK_PARTIAL – 有节点不可用,但仍有冗余节点。
  
* OK_NO_TOLERANCE – 有足够的online节点,但没有冗余,例如:两个节点的Cluster,其中一个挂了,集群就不可用了。
  
* NO_QUORUM – 有节点处于online状态,但达不到法定节点数,此状态下Cluster无法写入,只能读取。
  
* UNKNOWN – 不是online或recovering状态,尝试连接其他实例查看状态。
  
* UNAVAILABLE – 组内节点全是offline状态,但实例在运行,可能实例刚重启还没加入Cluster。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-613862-1-1.html 上篇帖子: mysql+amoeba读写分离 下篇帖子: Mysql主从复制(无数据情况)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表