2 Star 1 Fork 0

zhrun8899 / learning-notes

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
vmcenter6.7安装.md 54.62 KB
一键复制 编辑 原始数据 按行查看 历史

新服务器安装

零 前言

1.vmcenter访问路径:

https://172.30.120.3

2. sftpd部署

172.30.120.54

## 3.ansible

172.30.120.4 193.169.1.87 可上网,配置squid,其它机器通过该机器代理使用YUM

4.GFS

172.30.120.21-23 测试

172.30.120.24-26 生产

5.windows虚拟机

windows2012:172.30.120.57-59

6.IP规划:

生产环境IP规划:网段 172.30.120.0/24

IP 软件安装 说明
172.30.120.1 网关
172.30.120.3 vmcenter vmcenter
172.30.120.4 squid+ansible 管理机及代理
172.30.120.11-20 esxi esxi主机
172.30.120.21-30,24-26 glusterfs,nginx 文件及网络服务
172.30.120.31-40 mysql+mysqlcluster+mysqlrouter db
172.30.120.41-50 保留区
172.30.120.51- 结尾为0的不用,1,4,7在第一台上面,2,5,8在第二台上,3,6,9在第三台服务器上。 应用区

172.30.120.11-13 :80-->7.2 ,4.2

172.30.120.3:443-->7.2,4.2

172.30.120.4:22-->4.2,7.2

7.虚拟机命名规则:

IP地址最后位操作系统简称+_主机ip地址最后位_虚拟机用途
如   04c_11_ansible
c:centos,04:ip,11:主机IP,ansible:用途
IP地址不足两位,前补0

8.模板规划:

2C/4G/50G:需要创建 tmp_c7_2c_4g_50g

4C/8G/50G:已有

2C/4G/100G:已有

4C/8G/100G:需要创建 tmp_c7_4c_8g_100g

需要提前安装的软件:

yum install epel-release yum install -y lsof vim telnet net-tools fontconfig mkfontscale lrzsz yum-utils,ntp yum install -y centos-release-gluster

注意:使用模板复制的虚拟机会有相同的machine_id,文件在/etc/machine_id下.该文件为空时会在下次重新启动时重新生成一个.可采用此办法解决.

一.squid 安装及配置

详见[squid 代理上网](squid 代理上网.md)

## 1.安装

yum install squid -y

yum install httpd-tools -y

2.设置访问密码

htpasswd -cd /etc/squid3/passwords webimation elinkD18 ## 注意密码中不能有@字符,否则代理设置中不好处理

3.配置文件

vim /etc/squid/squid.conf

#在最后添加
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid3/passwords
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
http_access allow authenticated

#这里是端口号,可以按需修改
#http_port 3128 这样写会同时监听ipv6和ipv4的端口,推荐适应下面的配置方法。
http_port 0.0.0.0:3128

## 4.启动squid服务

systemctl start squid.service

5.防火墙

如果启动需要增加 3128的访问

二. ansible配置

详见ansible.md

1.安装

yum -y install epel-release.noarch

yum install ansible

2.ssh 公钥

ssh-keygen -t rsa ssh-copy-id root@192.168.9.114 ssh-copy-id root@192.168.9.144 ssh-copy-id root@192.168.9.174 ssh-copy-id root@192.168.9.113

3. 配置

/etc/ansible/ansibles.cfg

host_key_checking = False

4.主机列表:/etc/ansible/hosts

该文件还可以用来做虚拟机的一个描述文件,另外在vcenter中也可以建立目录管理虚拟机

[adminserver]
192.168.9.111
[dbserver]
192.168.9.114
192.168.9.144
192.168.9.174
[appserver]
192.168.9.113
[webservers]

5.常用命令

ansible-console web
ansible  web -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm  dest=/tmp/ mode=0440 force=yes"
ansible web -m yum -a 'name=net-tools state=present'
ansible web -m fetch -a 'src=/etc/fstab dest=/tmp/'
[root@saltMaster ~]# vim /etc/ansible/net.sh
sed -i '$a proxy=http://webimation:elinkD18@192.168.9.111:3128/ ' /etc/yum.conf
[root@saltMaster ~]# ansible web -m script -a "addProxy.sh"
ansible webservers -m shell -a "free -m"
## 字体 
ansible web -m yum -a "name=mkfontscale state=present "
ansible web -m yum -a "name=fontconfig state=present "

三.vmcenter6.7

1. 基本概念

FC: fibre channel光纤通道 (FC)

LUN: logical unit number 逻辑单元编号

iSCSI: Internet SCSI

FCoE: fibre channel of ethernet ,以太网上的光纤通道

DRS: VMware Distributed Resource Scheduler

EVS:

EVC:增强型 vMotion 兼容性 ,enhanced vmotion compatible

无论主机使用何种类型的存储设备,虚拟磁盘始终会以挂载的 SCSI 设备形式呈现给虚拟机。虚拟磁盘会向虚拟机操作系统隐藏物理存储器层。这样可以在虚拟机内部运行未针对特定存储设备(如 SAN)而认证的操作系统。

VMFS:vSphere 虚拟机文件系统 (Virtual Machine File System ) 格式。 该格式是一种针对存储虚拟机而优化的特殊高性能文件系统格式。

Virtual SAN 不支持 RDM、VMFS、诊断分区和其他设备访问功能。

存储消耗应低于 70%。

Virtual SAN 占 10% 的 CPU 开销

内存:vsan需要32G. 5组*7盘/每组

VAPP:vSphere vApp 是用于对应用程序进行打包和管理的格式。一个 vApp 可包含多 个虚拟机。

群集:要作为一个整体运作的 ESXi 主机及关联虚拟机的集合。为群集添加主机时,主 机的资源将成为群集资源的一部分。群集管理所有主机的资源。 如果在群集上启用 VMware EVC,则可以确保通过 vMotion 迁移不会因为 CPU 兼容性错误而失败。如果针对群集启用 vSphere DRS,则会合并群集内主机的 资源,以允许实现群集内主机的资源平衡。如果针对群集启用 vSphere HA, 则会将群集的资源作为容量池进行管理,以允许快速从主机硬盘故障中恢复。

主机和群集(包括数据存储群集)是物理资源的提供方。 对于主机,可用的资源是主机的硬件规格减去虚拟化软件所用的资源.

虚拟机是资源用户。

接入控制:

启动虚拟机时,服务器检查是否有足够的未预留资源可用,并仅在有足够的资源时才允许启动虚拟机。此过程称为接入控制.

数据中心:与用于组织特定对象类型的文件夹不同,数据中心集合了在虚拟基础架构中开展工作所需的所有不同类型的对象:主机、虚拟机、网络和数据存储。 在数据中心内,有四种独立的层次结构。

  • 虚拟机(和模板)
  • 主机(和群集)
  • 网络
  • 数据存储

主机:安装有 ESXi 的物理机。所有虚拟机都在主机上运行。

虚拟机:虚拟化的计算机环境,可在其中运行客户机操作系统及其相关的应用程序软件。同一台受管主机上可同时运行多台虚拟机。

模板 :虚拟机的主副本,可用于创建和置备新虚拟机。模板可以安装客户机操作系统和应用程序软件,并可在部署过程中自定义以确保新的虚拟机有唯一的名称和网络设置。

资源池:

详见[资源管理部分](vSphere 资源管理指南-vsphere-esxi-vcenter-server-65-resource-management-guide.pdf)

资源池用于划分主机或群集的 CPU 和内存资源。虚拟机在资源池中执行并利用其中的资源。可以创建多个资源池,作为独立主机或群集的直接子级,然后将其控制权委派给其他个人或组织。

资源池是灵活管理资源的逻辑抽象。资源池可以分组为层次结构,用于对可用的 CPU 和内存资源按层次结构 进行分区。相应地,资源池既可以被视为资源提供方,也可以被视为资源用户。它们向子资源池和虚拟机提供 资源,但是,由于它们也消耗其父资源池和虚拟机的资源,因此它们同时也是资源用户。

管理资源时,应清楚自己的目标。

除了解决资源过载问题,资源管理还可以帮助您实现以下目标:

  • 性能隔离 — 防止虚拟机独占资源并保证服务率的可预测性。
  • 高效使用 — 利用未过载的资源并在性能正常降低的情况下过载。
  • 易于管理 — 控制虚拟机的相对重要性,提供灵活的动态分区并且符合绝对服务级别协议。

份额

指定虚拟机(或资源池)的相对重要性。如果某个虚拟机的资源份额是另一个虚拟机的两倍,则在这两个 虚拟机争用资源时,第一个虚拟机有权消耗两倍于第二个虚拟机的资源。 份额通常指定为 高、 正常或 低,这些值将分别按 4:2:1 的比例指定份额值。还可以选择 自定义为各虚拟机分配特 定的份额值(表示比例权重)。

资源分配预留

预留指定保证为虚拟机分配的最少资源量。 仅在有足够的未预留资源满足虚拟机的预留时,vCenter Server 或 ESXi 才允许您打开虚拟机电源。即使物理服 务器负载较重,服务器也会确保该资源量。预留用具体单位(兆赫兹 (GHz) 或兆字节 (MB))表示。 例如,假定您有 2GHz 可用,并且为 VM1 和 VM2 各指定了 1GHz 的预留量。现在每个虚拟机都能保证在需 要时获得 1GHz。但是,如果 VM1 只用了 500MHz,则 VM2 可使用 1.5GHz。 预留默认为 0。可以指定预留以保证虚拟机始终可使用最少的必要 CPU 或内存量。

### 资源分配限制 限制功能为可以分配到虚拟机的 CPU、内存或存储 I/O 资源指定上限。 服务器分配给虚拟机的资源可大于预留,但决不可大于限制,即使系统上有未使用的资源也是如此。限制用具 体单位(兆赫兹 (GHz) 或兆字节 (MB) 或每秒 I/O 操作数)表示。 CPU、内存和存储 I/O 资源限制默认为无限制。如果内存无限制,则在创建虚拟机时为该虚拟机配置的内存量 将成为其有效限制因素。 多数情况下无需指定限制。指定限制的优缺点如下: n 优点 — 如果开始时虚拟机的数量较少,并且您想对用户期望数量的虚拟机进行管理,则分配一个限制将非 常有效。但随着用户添加的虚拟机数量增加,性能将会降低。因此,您可以通过指定限制来模拟减少可用 资源。 n 缺点 — 如果指定限制,可能会浪费闲置资源。系统不允许虚拟机使用的资源超过限制,即使系统未充分利 用并且有闲置资源可用时也是如此。请仅在有充分理由的情况下指定限制。

资源分配设置建议 选择适合 ESXi 环境的资源分配设置(预留、限制和份额)。 遵循以下准则有助于使虚拟机获得更好性能。 n 使用 预留来指定可接受的最低 CPU 量或内存量,而不是想要使用的量。预留表示的具体资源量不会随环 境改变(例如添加或移除虚拟机)而变化。主机可以根据虚拟机的限制、份额的数量和估计需求将额外的

资源指定为可用资源。

请不要将所有资源全部指定为虚拟机的预留(请计划将至少 10% 的资源保留为未预留)。系统容量越接近 于被全部预留,想要在不违反接入控制的情况下更改预留和资源池层次结构就越困难。在支持 DRS 的群集 内,如果预留完全占用群集或群集内各台主机的容量,则会阻止 DRS 在主机之间迁移虚拟机。 如需频繁更改总可用资源,可使用 份额在虚拟机之间合理分配资源。例如,如果使用 份额,并且升级主机, 那么,即使每个份额代表较大的内存量、CPU 量或存储 I/O 资源量,每个虚拟机也保持相同的优先级(保 持相同数量的份额)。

2.可选 vCenter Server 功能

vMotion

一种可用于将正在运行的虚拟机从一个 ESXi 主机迁移到另一个 ESXi 主机上,并且不会中断服务的功能。它需要在源主机和目标主机上分别许可。vCenter Server 可集中协调所有 vMotion 活动。vMotion 也称为实时迁移或热迁移.

NVRAM 文件:虚拟机的BIOS 设置的配置文件

EVC:Enhanced vMotion Compatibility

Storage vMotion

该功能用于将运行中虚拟机的磁盘和配置文件从一个数据存储移至另一个数据存储,而不会中断服务。该功能需要在虚拟机的主机上获得许可。

vSphere HA

一种使群集具备 High Availability 的功能。如果一台主机出现故障,则该主机上运行的所有虚拟机都将立即在同一群集的其他主机上重新启动。启用群集的 vSphere HA 功能时,需指定希望能够恢复的主机数。如果将允许的主机故障数指定为 1,vSphere HA 将使整个群集具备足够的容量来处理一台主机的故障。该主机上所有正在运行的虚拟机都能在其余主机上重新启动。默认情况下,如果启动虚拟机会与故障切换所需的容量发生冲突,则无法启动此 虚拟机。有关详细信息,请参见《vSphere 可用性》文档。

vSphere DRS

一种有助于改善所有主机和资源池之间的资源分配及功耗状况的功能。vSphere DRS 收集群集内所有主机和虚拟机的资源使用情况信息,并在出现以下两种情况之一时给出建议(或迁移虚拟机):n 初始放置位置 - 当您首次打开群集中的某个虚拟机的电源时,DRS 将放置该虚拟机或提出放置建议。 负载平衡 - DRS 会尝试通过执行虚拟机的自动迁移 (vMotion) 或提供虚拟机迁移建议提高群集中的资源利用率。

存储 DRS

一种可用于将多个数据存储作为单个计算资源(称为数据存储群集)进行管理的功能。数据存储群集是多个数据存储聚合到一个逻辑、负载平衡池中的集合。可以将数据存储群集视为一个可变存储资源进行资源管理。可以将虚拟磁盘分配给数据存储群集,且存储 DRS 会为其找到相应的数据存储。负载平衡器会根据工作负载测量负责初始放置和后续迁移。存储空间平衡和 I/O 平衡可将虚拟机性能的空间不足风险和 I/O 瓶颈风险降到最低。

vSphere Fault Tolerance

vSphere Fault Tolerance 通过创建和维护与主虚拟机相同,且可在发生故障切换时随时替换主虚拟机的辅助虚拟机,来确保虚拟机的连续可用性。

资源包括 CPU、内存、电源、存储器和网络资源

vsphere data protection:

vsphere data protection 可以备份恢复虚拟机

vRealize Operations Manager

从虚拟环境中收集各个级别的每个对象,包括数据中心,集群,虚拟机,存储,等信息,并存储,分析这些数据,提供展示功能.

VMware- - vRealize- - Log- - Insight


2.windows 2012 安装vcenter6.5或6.7

2.1.安装win2012

windows server 2012 r2 安装密钥 ServerStandard=NB4WH-BBBYV-3MPPC-9RCMV-46XCB

ServerDatacenterCore=BH9T4-4N7CW-67J3M-64J36-WW98Y

ServerWeb=3WN48-GVPXF-VHWK4-29Y8D-KKTD2

ServerDatacenter=BH9T4-4N7CW-67J3M-64J36-WW98Y

ServerStandard=NB4WH-BBBYV-3MPPC-9RCMV-46XCB

ServerDatacenterCore=BH9T4-4N7CW-67J3M-64J36-WW98Y 本次使用的是 ServerDatacenter

2.2.Windows远程“要求的函数不受支持”解决办法

解决方法:ServerDatacenter

开启组策略中远程桌面链接安全层。 1、开始-运行-gpedit.msc,进入组策略编辑器; 2、找到左侧边栏计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-安全项; 3、修改以下两项:

A,远程(RDP)连接要求使用指定的安全层,改为启用,安全层选择RDP
B,要求使用网络级别的身份验证对远程连接的用户进行身份验证,改为禁用;

4、关闭组策略编辑器,重启计算机。

### 2.3.激活

查询windows版本 DISM /online /Get-CurrentEdition

最后有效的激活方法是使用马哥激活

2.4.桌面图标

在dos命令行下运行:rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0

即可配置**.注意:不能在powershell下运行,会出错!!.**

### 2.5.IP地址出现一个自动配置的IP

是由于手动配置的IP地址已经被占用.需要重新配置.

这个现象很奇怪,不得不说,win2012太垃圾了.不会提示你IP地址被占用的!!

2.6.win2012安装flashplayer

正常下载的flashplayer是安装不了的,需要使用windows安装

服务器管理器-->本地服务器

右上角菜单:管理-->添加角色和功能

连续点“下一步”,功能--->转到“服务器角色”,找到“用户界面和基础结构”,勾选“桌面体验”。

2.7.安装vcenter

域名及站点名称:

用户名/密码:administrator@vsphere.wanbex.com/elink@D18

登陆地址:https://192.168.9.3 ,配置页面:https://192.168.9.3:5480

注意:192.168.9.3不能去掉.vcenter使用该IP地址

可以使用vmwarevsphere6.5keygen_downcc.com.zip 生成许可

esxi6.5 license:HV4WC-01087-1ZJ48-031XP-9A843

vcenter 6.5许可: JG4XA-DE287-08EA9-CL3Z6-26H58

3.管理及配置

3.1.vcenter 及 esxi 中的ssh,shell功能开启

主机上,F2-->trouble shooting -->enable ssh ,enable esxi shell

开启后可以使用ssh连接esxi 或vcenter,并使用命令行.

esxi 的datastore目录:

F2-->triuble shootings-->enable ssh ,enable shell

ssh连接192.168.0.200,201,202,如使用mobaxterm,xshell等.

cd /vmfs/volumes/
cd datastorexxx
pwd
     /vmfs/volumes/datastore201 
     /vmfs/volumes/datastore202
     /vmfs/volumes/datastore200

3.2.给vcenter增加IP地址

有时esxi网络与vcenter不在一个网段,为了在vcenter中管理esxi,需要给vcenter增加一个IP.

使用SSH连接vcenter,输入shell,使root用户有shell功能,cd /etc/systemd/network

vi 10-eth0.network (也可能会是别的文件名?)

[Match]
Name=eth0

[Network]
Gateway=192.168.9.1
Address=192.168.9.3/24
Address=192.168.0.3/24
DHCP=ipv6
Domains=

[DHCP]
UseDomains=true
ClientIdentifier=mac

[Route]
Destination=0.0.0.0/0
Gateway=192.168.9.1

只需要增加一个Address=192.168.0.3/24,重新启动vcenter即可.

### 3.3.迁移虚拟机

分为两种,冷迁移和vmotion

冷迁移只能在虚拟机关闭时进行,vmotion可在虚拟机启动的时候进行。与有无共享存储并无关系;

4.生产配置

### 4.1.主机及vcenter

esxi 主机IP:192.168.0.200 192.168.0.201 192.168.202

vcenter:192.168.9.3 192168.0.3

### 4.2.虚拟机IP段划分:

暂时按每主机30个虚拟机划分

主机 IP段 系统
192.168.0.200 192.168.0.101-130 101-110 windows
111-130 centos7
192.168.0.201 192.168.0.131-160 131-140 windows
141-160 centos7
192.168.0.202 192.168.0.161-190 161-170 windows
171-190 centos7

4.3.需要安装的软件

windows:windows server 2012 datacenter,navcat,chrome,jdk

centos7:jdk,mysql,lsof,telnet,net-tools,ntp

常规配置:centos:4C/8G/50G,4C/8G/100G 精简置备,各一做模板

​ mysql:4C/8G/500G,厚置备,准备使用Mysql8cluster+mysql8router,主1从2;

​ 文件服务器:准备使用fastdfs/nfs/vsan之一, 4C/8G/500G*3,厚置备

5.许可证

vmcenter:VMware vCenter Server 6 Standard

vsphere:VMware vSphere with Operations Management 6 Enterprise Plus for vSphere (CPU)

四. nfs

NFS是Network File System的缩写,中文称为网络文件系统,它的主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中(就是某一个关在点下),从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。

​ IP:

​ server:192.168.9.113

​ client:192.168.9.112

1.服务端安装

1.1.安装

yum install nfs-utils rpcbind -y

1.2.启动 rpcbind :

systemctl start rpcbind.service

开放端口 111

【特别注意】必须先启动rpcbind服务之后,才能启动nfs服务 原因:nfs可以视为一个rpc程序,在启动任何一个rpc程序之前,需要做好端口和功能的映射工作,这个映射工作就是由rpcbind服务来完成的,因此在提供nfs服务之前,必须要先启动rpcbind服务

1.3 启动nfs服务

systemctl start nfs.server.service

1.4 查看端口映射情况:

[root@nfs01 ~]# rpcinfo -p localhost

1.5 配置nfs服务的配置文件/etc/exports

在此配置哪些服务器允许连接,默认情况下该配置文件是空的:

/data 172.30.120.50/24(rw,sync)
/data 172.30.121.52/24(rw,sync)

1.6 创建共享目录

[root@nfs01 ~]# mkdir /data -p [root@nfs01 ~]# ll -d /data/

1.7 更改共享目录的权限

[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data [root@nfs01 ~]# ll -d /data

1.8 重新加载NFS服务

[root@nfs01 ~]# systemctl restart nfs-server.service

1.9 查看有权限挂载本服务器的地址

showmount -e 192.168.9.113

/data 192.168.9.111/24,192.168.9.112/24

【方法2】可以在把NFS服务器当做客户端来进行挂载测试 [root@nfs01 ~]# mount -t nfs 192.168.9.113:/data /mnt

2 NFS客户端的配置

2.1 安装 nfs及rpcbind

客户端也需要安装nfs及rpcbind,但不需要启动nfs服务.

安装nfs-utils软件的目的是为了使用showmount等功能,所以客户端最好也装上,但是不启动NFS服务

yum install nfs-utils rpcbind -y

2.2 启动RPC服务并进行查看

启动: [root@client1 ~]# systemctl start rpcbind.service

2.3 dns解析

echo "192.168.9.113 nfsserver" >> /etc/hosts

### 2.4 察看是否能连到nfs

showmount -e 192.168.9.113

2.5 挂载nfs硬盘

mkdir /data -p

mount -t nfs 192.168.9.113:/data /data

2.6 加入自动启动

systemctl enable rpcbind

3.服务端防火墙问题

111 2049 703 995 30001-30005

所有端口均需要开放TCP/UDP

nfs启动时会随机启动多个端口并向RPC注册,如果使用iptables对NFS进行限制会很麻烦,可以更改配置文件固定NFS服务相关端口,机器或服务重启后之前添加的iptables规则就失效了.

vim /etc/sysconfig/nfs

RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004

4.有关参数

centos7.6-1810

libnfsidmap-0.25-19.el7.x86_64 nfs-utils-1.3.0-0.61.el7.x86_64

rpcbind-0.2.0-47.el7.x86_64

5.文件服务思路

一个虚拟机挂载存储5T,做生成及展示.配置nfs server.

展示可多机均衡,做nfs client.可像本地文件一样访问服务器上文件.

五.Mysql服务

详见[MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册](MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册)

IP 安装 说明
192.168.9.114,144,174 mysql8,mysqlrouter,cluster,keepalived
192.168.9.199 VIP,router HA对外访问地址
192.168.9.111 ansible管理机,squid代理
192.168.9.3 vcenter6.7
192.168.9.113,143,173 nginx,jdk
 mysql -uroot -e "create database jumpserver default charset 'utf8'; grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by '$DB_PASSWORD'; flush privileges;"

使用:Mysql innodb cluster+mysql 8.0.17+mysql router+mysql client

访问层

​ 可以在每台需要访问的虚拟机上安装mysql router

​ 或者 mysql router+keepalived,实现mysql router 高可用 ,消除单点故障.

服务器:192.168.9.114,144,174

操作系统:centos7.6-1810

InnoDB Cluster以组复制为基础,集群中的每个MySQL服务器实例都是组复制的成员,提供了在InnoDB Cluster内复制数据的机制,并且具有内置的故障转移功能。

MySQL Shell是MySQL Server的高级客户端和代码编辑器。除了和mysql命令行客户端程序一样,使用常规的SQL功能外,MySQL Shell还提供了JavaScript和Python的脚本功能,并包含多个API,其中的AdminAPI用于操作InnoDB Cluster。 MySQL Shell可以以表格、Tab分割、垂直或JSON格式输出返回结果。 MySQL Shell包含许多以JavaScript和Python模式存在的内置全局对象:cluster代表InnoDB Cluster;dba使用AdminAPI提供对InnoDB Cluster管理功能的访问;session表示全局会话;db代表缺省数据库;shell提供对MySQL Shell函数的访问;util提供MySQL ShellMySQL Shell实用程序。

6.1 linux 配置

6.1.1limit优化

vi /etc/security/limits.conf

文件最后:

cat >>/etc/security/limits.conf <<EOF
.
* hard nofile 65535
* soft nproc 65535
* hard noproc 65535
EOF

然后注销一下,ulimit -n,验证

cat>>/etc/pam.d/login <<EOF
session required /lib/security/pam_limits.so
session required pam_limits.so
EOF
cat>>/etc/profile<<EOF

if [ $USER = "mysql" ]; then
ulimit -u 16384 -n 65536
fi
EOF

6.1.2.配置hostname 及hosts

vi /etc/hostname

node01

vi /etc/hosts

# 配置各个主机名称解析到hosts文件(集群中的每一台服务器)

192.168.9.114 node01
192.168.9.144 node02
192.168.9.174 node03

检查是否正确配置:SELECT coalesce(@@report_host, @@hostname);

6.1.3 防火墙及selinux

/etc/sysconfig/selinux

SELINUX=disabled
## 防火墙
systemctl stop firewalld
systemctl disable firewalld

6.1.4 设置环境mysql环境变量,rpm版安装的不需要

vi /etc/profile.d/mysql.sh,添加如下内容

MYSQL=/usr/local/mysql/bin
export PATH=$PATH:$MYSQL

加载mysql环境变量

source /etc/profile.d/mysql.sh

### 6.1.5 /etc/systemctl.conf

fs.aio-max-nr = 1048576
fs.file-max = 681574400
kernel.shmmax = 137438953472 
kernel.shmmni = 4096
kernel.sem = 250 32000 100 200
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 262144
net.core.rmem_max = 419430
net.core.wmem_default = 262144
net.core.wmem_max = 1048586

6.2. 配置mysql 集群

创建数据库目录,rpm安装在/va/lib/mysql下

mkdir -pv /usr/local/mysql/data
chown mysql:mysql /usr/local/mysql/data

初始化数据库

mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data

修改mysql 初始密码:

mysqladmin -uroot -p'初始化密码' password'123456';

设置mysql开机启动并启动mysql

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 345 mysqld on

安装mysql-shell

rpm -ivh mysql-shell-8.0.11-1.el7.x86_64.rpm

创建用户并修改密码:

create user 'cluster'@'%' identified by 'elink@D18';
## 赋予权限
grant all privileges on *.* to 'cluster'@'%';
## 集群所需权限
GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO 'cluster'@'%' WITH GRANT OPTION;
--
GRANT RELOAD,SHUTDOWN,PROCESS,FILE,SUPER,REPLICATION SLAVE,REPLICATION CLIENT,CREATE USER ON *.*  TO 'cluster'@'%' WITH GRANT OPTION;
## 完整的赋予权限:
GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `cluster`@`%`  with grant option;

vi /etc/my.cnf

[mysqld]
# server configuration
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
bind-address    = 0.0.0.0
# Disabling symbolic-links is recommended to prevent assorted security risks
#symbolic-links = 0
# Replication configuration parameters
# 禁止其他引擎创建库表:在my.cnf
disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
server_id = 1 #2,3
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
transaction_write_set_extraction = XXHASH64
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
relay-log = svr-relay-bin
# (组内成员数)
auto_increment_increment=3
#(这里的server_id最好为1,2,3这样的自增量,且每台都不同)
auto_increment_offset=server_id
#
# Group Replication configuration
loose-group_replication_group_name = a38e32fd-5fb6-11e8-ad7a-00259015d941
loose-group_replication_start_on_boot = OFF
loose-group_replication_local_address = node01:33060
loose-group_replication_group_seeds = node01:33060,node02:33060,node03:33060
loose-group_replication_bootstrap_group = OFF
loose-group_replication_allow_local_disjoint_gtids_join = ON
# Group Replication configuration multi-primary mode
loose-group_replication_single_primary_mode = on
loose-group_replication_enforce_update_everywhere_checks = Off

启动 mysqld

systemctl start mysqld.service

检查参数的sql语句:

show variables like 'group_replication%';

配置实例

dba.configureLocalInstance('root@localhost:3306');

检查实例:

dba.chekInstanceConfiguration('root@localhost:3306')

在任意一台mysql实例节点执行以下命令:

mysqlsh shell.connect('root@sql-1:3306')
var cluster = dba.createCluster('mailCluster');

如果创建成功输出的信息中会有类似“Cluster successfully created.”的语句

将另外两个节点加入到Cluster集群中

cluster.addInstance('root@node02:3306');
cluster.addInstance('root@node03:3306');

检查集群状态

cluster.status();

保存配置信息到配置文件(在每个SQL节点执行),文件在 /var/lib/mysql/mysqld-auto.conf.

dba.configureLocalInstance('root@localhost:3306');

注意:该命令在mysql8.0.11后不需要执行,会自动保存.

6.3mysqlcluster Q & A

日志选项

mysqlsh --log-level=DEBUG3

会记录执行命令所产生的sql语句,位置:~/.mysqlsh/目录下.

mysqld-auto.cnf 文件

cluster已经使用 dba.dropMetadataSchema() 删除,但

show variables like 'group_replication%' 仍然显示错误的配置信息,并不是/etc/my.cnf中的配置.

是因为已经存在的配置文件mysqld-auto.cnf ,位置在 /var/lib/mysql下.删除后正常.

删除集群信息

注意:如果该实例已经归属于某个集群,则可以

重新启动集群:dba.rebootClusterFromCompleteOutage()

删除集群:

dba.dropMetadataSchema() 

或解散原来的集群

mysql-js> cluster.dissolve({force: true})

检查集群状态:

mysqlsh --uri=cluster@node01:3306
## 该命令只在旧版本中存在 
mysql-js> dba.checkInstanceConfiguration('root@node01:3306')

集群有关命令:

dba.configureInstance('root@node03:3306')
dba.checkInstanceConfiguration('root@node03:3306')
var Cluster=dba.createCluster()
Cluster.addInstance()
Cluster.removeInstance()
Cluster.rejoinInstance()
cluster.addInstance(‘rep1@10.6.248.197:3306’);
## 帮助信息
dba.help('')
object.help('')
dba.help(‘createCluster’)

mysql group replication 的重新启动:

一类是:滚动重启 节点启动后,执行:start group_replication,确认状态即可

二类是: 全部一块重启(集体掉电)第一个节点启动(single-master & multi-master 都一样)

​ set global group_replication_bootstrap_group=on;

​ start group_replication;

6.4 mysqlrouter

部署选项:oracle建议与应用部署到同台机器上,但如果cluster有变化,则mysql router需要重新配置并重新启动,会给维护带来很多麻烦,所以采用另一种部署方案,keepalived+mysqlrouter.与mysql部署到同一台机器上.

下载:

mysql-router-community-8.0.17-1.el7.x86_64.rpm

安装:

rpm -ivh mysql-router-community-8.0.17-1.el7.x86_64.rpm

mysqlrouter --bootstrap root@node01:3306 --user=mysqlrouter

启动router:

systemctl start mysqlrouter.service
/etc/init.d/mysqlrouter restart
## 自动启动:
systemctl enable mysqlrouter.service

这条命令将产生一个mysql router配置文件:/etc/mysqlrouter/mysqlrouter.conf

同时在数据库中生成一个mysql-router用户,并在/etc/mysqlrouter/mysqlrouter.key 生成一个key.

连接端口:

classic protocol: 6446(rw),6447(ro),

X protocol: 64460(rw),64470(ro)

测试:

mysqlsh root@node03:6442

生产中的使用

1.每个客户机上安装mysqlrouter,应用连接本地的mysqlrouter.

2.搭建高可用mysqlrouter.配置keepalived. 分别在三台服务器安装keepalived

keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。

其中集群中MASTER和BACKUP角色进行切换,是由priority和weight共同决定的。weight的绝对值一定为整数。 一、weight为正数(+int): ① 脚本执行成功,MASTER节点的priority和int之和小于BACKUP节点的priority和int之和,则发生角色切换; ② 脚本执行失败,MASTER节点的priority和int之和大于BACKUP节点的priority和int之和,则不发生角色切换。 二、weight为负数(-int): ① 脚本执行失败,MASTER节点的priority和int之差小于BACKUP节点的priority,则发生角色切换; ② 脚本执行成功,MASTER节点的priority和int之差大于BACKUP节点的priority,则不发生角色切换。 因此为了保证weight的值能够保证脚本在成功与失败后触发主备切换,通常设置weight的绝对值大于主备节点priority之差

keepalived.cnf:

! Configuration File for keepalived

global_defs {
   notification_email {
     runzh@163.com
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.9.114
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   # vrrp_strict # must turn it off ,otherwise ,vip cannot be accessed
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script chk_mysqlrouter{
      script "/etc/keepalived/chkport.sh 6446"
      interval 10
      weight -10

}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    nopreempt
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.9.199
    }
    track_script{
    chk_mysqlrouter
    }
}

check_port.sh

#!/bin/env bash
CHECK_PORT=$1
CHECK_PORT_COMMANDS="grep -w $CHECK_PORT $PORT_LIST"
if [ "$CHECK_PORT" != "" ];then
    if ! ss -tpnl|$CHECK_PORT_COMMANDS &>/dev/null;then
        sleep 2
        ss -tpnl|$CHECK_PORT_COMMANDS &>/dev/null || exit 1

    fi
fi

检测nginx脚本

检测nginx脚本,若未启动,则启动;否则关闭keepalived.

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /opt/nginx/sbin/nginx #尝试重新启动nginx
    sleep 2  #睡眠2秒
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
    fi
fi

开机运行服务**

systemctl enable keepalived

systemctl enable mysqlrouter

systemctl enable mysqld

6.5 Application接入方案

首先在服务器端采用1+N的模型来安装和配置MySQL数据库。1就是一个master数据库,N就是一至多个slave数据库。master数据 库必须启用binlog模式,关于这两种数据库的配置参见MySQL的文档。配置完成后就形成了一个1+N的复制集群,当对master进行修改时会自动 把修改的数据更新到N个slave数据库上。但是有一个注意的是,所有的修改操作包括添加、删除、修改等语句必须作用在master数据库上,这样才能使 数据可靠的复制到其他slave服务器上。另外,由于slave服务器只用作查询,因此选用MyISAM的存储引擎可以提高查询的速度。

而在客户端呢?如何使客户端程序能均衡的使用这些可用的服务器呢?而且更新操作只能对master进行处理。这个岂不是应用程序对数据库的操作逻辑非常的复杂?

其实没有那么复杂,MySQL为我们提供了接口可以将这些复杂的操作透明化。下面主要介绍采用JDBC的客户端如何工作在基于复制的集群环境中,其他编程语言请参照mysql的文档。

MySQL最新的JDBC驱动程序包中提供了一个驱动类就是 com.mysql.jdbc.ReplicationDriver 。这个驱动类允许在url中设置多个mysql主机地址,例如:

jdbc:mysql://master1,slave1,slave2/dlog?autoReconnect=true&roundRobinLoadBalance=true

在上面的url中,有三个主机地址分别是master1,slave1,slave2,其中ReplicationDriver 规定第一个主机是master主机地址,剩下的全部是slave主机。另外有两个参数必须指定为true,就是autoReconnect和roundRobinLoadBalance。

使用这个驱动和配置后还不能马上解决所有的问题,我们还需要对程序做一些小改动。

我们必须告诉驱动程序,哪些语句的执行是作用在master数据库,而哪些语句的执行作用在slave数据库上。

ReplicationDriver 是通过Connection对象的readOnly属性来判断该操作是否为更新操作。因此我们在执行一个sql语句的时候必须调用一下 setReadOnly告诉驱动程序当前执行的操作是否是只读。如果你是使用hibernate操作数据库的,那可以调用 Query.setReadOnly方法。

连接串:slave即为readonly的地址

jdbc:mysql:replication://address=(type=master)(host=192.168.9.114)(port=6446),address=(type=master)(host=192.168.9.144)(port=6446),address=(type=slave)(host=192.168.9.114)(port=6447)../databaseName?autoReconnect=true&roundRobinLoadBalance=true

使用JDBC replication协议:此协议有非常多的高级特性,可以认为是客户端级的路由组件,支持“负载均衡”、“failover”等。JDBC URL中地址使用Router集群的地址,Router集群的高可用将借助于replication协议实现,当某个Router节点失效,replication协议可以将请求Failover到URL列表中的其他Router节点。

程序改动尽可能少的话还是配多个数据源 spring 有个 AbstractRoutingDataSource 类,继承这个类实现自己的数据库选择方式就行了 指定 datasource 的时候有多种选择,比如自己写个注解标示 datasource 写 mapper 的时候注解指定是哪个 datasource .

两个参数必须指定为true,就是autoReconnect和roundRobinLoadBalance。

默认情况下,Spring Data JPA 实现的方法都是使用事务的。针对查询类型的方法,其等价于 @Transactional(readOnly=true);增删改类型的方法,等价于 @Transactional。可以看出,除了将查询的方法设为只读事务外,其他事务属性均采用默认值。

使用mybatis的用户:需要查找解决方案

<bean id="dataSource" **class**="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">  
     <property name="url" value="jdbc:mysql:replication://.../test"/>  
​    <property name="username" value="root"/>  
​    <property name="password" value="root"/>  
​    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
​    <property name="maxIdle" value="12"/>  
​    <property name="minIdle" value="2"/>  
​    <property name="maxActive" value="32"/>  
​    <property name="maxWait" value="6000"/>  
​    <property name="initialSize" value="2"/>  
​    <property name="testOnBorrow" value="true"/>  
​    <property name="testOnReturn" value="true"/>  
​    <!--必须为**true** -->  
​    <property name="defaultAutoCommit" value="true"></property>  
​    <property name="removeAbandoned" value="true"/>  
​    <property name="removeAbandonedTimeout" value="60"/>  
​    <property name="validationQuery" value="SELECT 1"/>  
​    <property name="validationInterval" value="30000"/>  
​    <property name="testWhileIdle" value="true"/>  
​    <property name="timeBetweenEvictionRunsMillis" value="30000"/>  
​    <property name="minEvictableIdleTimeMillis" value="300000"/>  
​    <!-- 此参数很重要,建议1分钟 -->  
​    <property name="maxAge" value="60000"/>  
​    <property name="jmxEnabled" value="true"/>  
</bean>  

我们需要特别注意“maxAge”、“defaultAutoCommit”、“testOnBorrow”参数,适度兼容Router的局限性才能更好的发挥作用。

良好架构下,针对WRITE操作的Router集群应该有3个节点,那么我们需要在URL中指定三个“type=master”的Router地址;此外“type=slave”的地址为接收READ操作的Router节点地址,需要多个。

此外有几个可以参考的参数,我们配合replication协议:

​ 1)autoReconnect:设置为false,遵循默认值。

​ 2)failOverReadOnly:此参数只会在autoReconnect为true时生效,建议保持默认值“true”。

​ 3)roundRobinLoadBalance:此参数只会在autoReconnect为true、failOverReadOnly为false时生效,建议保持默认值。

​ 4)readFromMasterWhenNoSlaves:当“type=slave”的所有地址都不可达时,是否可以将read请求转发给master,默认值为“false”,这个值根据实际情况设定,如果你的master可以承载所有的read请求,可以设置为true。

​ 5)loadBalanceStrategy:可选值为“random”、“bestResponseTime”、“serverAffinity”,默认值为“random”。

​ 6)loadBalanceAutoCommitStatementThreshold:当请求状态为“autoCommit”时,在一个连接上操作一定次数的请求后,触发“负载均衡”,选在其他Server。(参见源码)。

​ 7)allowMasterDownConnections:默认值为false,在replication协议中,如果Master无法连接时是否允许Client创建或者获取连接(包括获取Slave的连接)。“false”表示当Master无法连接时,将不能创建任何连接,包括Slave读操作。在基于Router集群时,建议设置为true。

​ 8)allowSlaveDownConnections:默认为false,同上。

6.5 测试高可用性

​ 要测试高可用性是否有效,可以通过终止实例来模拟意外停止。群集检测到实例离开群集并重新配置自身,重新配置的确切方式取决于使用的是单主群集还是多主群集,以及实例在群集中的角色。在单主模式下:

如果当前主节点离开集群,则其中一个辅助实例被选为新主节点,其中实例由最低server_uuid区分优先级。MySQL Router将读写连接重定向到新选择的主节点。 如果当前辅助节点离开群集,MySQL Router将停止将只读连接重定向到该实例。

检验结果:select @@hostname

1.停止主节点:node01

mysqladmin -uroot -p123456 shutdown

mysqlsh --uri=root@node02:6447

var cluster=dba.getCluster('mailCluster')

cluster.status()
##可以看到,node01:missing,node02成为primary

{
    "clusterName": "mailCluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "node02:3306",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures. 1 member is not active",
        "topology": {
            "node01:3306": {
                "address": "node01:3306",
                "mode": "n/a",
                "readReplicas": {},
                "role": "HA",
                "shellConnectError": "MySQL Error 2003 (HY000): Can't connect to MySQL server on 'node01' (111)",
                "status": "(MISSING)"
            },
            "node02:3306": {
                "address": "node02:3306",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.17"
            },
            "node03:3306": {
                "address": "node03:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.17"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "node02:3306"
}

node01 :systemctl start mysqld,再查:cluster.status():node01已经连接,但成了R/O

{
    "clusterName": "mailCluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "node02:3306",
        "ssl": "REQUIRED",
        "status": "OK",
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
        "topology": {
            "node01:3306": {
                "address": "node01:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.17"
            },
            "node02:3306": {
                "address": "node02:3306",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.17"
            },
            "node03:3306": {
                "address": "node03:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.17"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "node02:3306"
}

2.停止从节点:node02

mysqladmin -uroot -p123456 shutdown

6.6 维护集群

维护参考

6.6.1 配置实例的自动重新加入

运行MySQL 8.0.16及更高版本的实例支持组复制自动重新加入功能,可以将实例配置为在被驱逐后自动重新加入群集。 AdminAPI提供了autoRejoinTries选项,用于配置在驱逐后重新加入群集的尝试次数。默认情况下,实例不会自动重新加入群集。可以使用以下命令在集群级别或单个实例上配置autoRejoinTries选项:

dba.createCluster() Cluster.addInstance() Cluster.setOption() Cluster.setInstanceOption() autoRejoinTries选项对应group_replication_autorejoin_tries系统变量,例如将重连尝试次数由缺省的0改为10:

autoRejoinTries选项接受介于0和2016之间的正整数值,默认值为0,即不尝试自动重新加入。自动重连适用于网络不稳定的场景

select @@group_replication_autorejoin_tries;
var cluster = dba.getCluster(); 
cluster.setOption('autoRejoinTries',10)

6.6.2 从InnoDB Cluster中删除实例

​ 可以使用Cluster.removeInstance(instance)方法随时从群集中删除实例:

  • var cluster = dba.getCluster();
    cluster.removeInstance('root@node03:3306');

6.6.3 重启群集

可以使用dba.rebootClusterFromCompleteOutage()重启整个集群。此操作采用MySQL Shell当前连接的实例并使用其元数据来恢复群集。如果群集的实例已完全停止,则必须启动实例,然后才能启动群集。 在生产部署的情况下,必须在MySQL Shell之外启动实例。实例启动后,需要连接到中断之前应用了最多事务的实例。如果不确定是哪个实例,可连接到任何实例并按照dba.rebootClusterFromCompleteOutage()中的交互消息进行操作,该消息检测连接的实例是否应用了最多事务。

在服务器重新启动后需要执行该操作,切记

重新启动无法成功,则需要删除集群,重新建立

6.6.4 删除集群元数据。

dba.dropMetadataSchema方法应仅用作无法还原群集时的最后手段,并且删除的元数据是不可恢复的。

6.6.5 解散InnoDB Cluster

解散InnoDB Cluster需要连接到状态为ONLINE的读写实例,例如单主集群中的主实例,并使用Cluster.dissolve()命令。这将删除与群集关联的所有元数据和配置,并禁用实例上的组复制,但不会删除在实例之间复制的任何数据。要再次创建集群,使用dba.createCluster()。

6.6.6 更改组复制拓扑

​ InnoDB Cluster默认以单主模式运行,其中集群具有一个接受读写(R/W)的主服务器,集群中的所有其余实例仅接受只读(R/O) 。将群集配置为在多主模式时,群集中的所有实例都是主节点,这意味着它们同时接受读取和写入查询(R/W)。如果群集的所有实例都运行MySQL服务器版本8.0.15或更高版本,则可以在群集联机时更改群集的拓扑。

指定一个新的主节点:Cluster.setPrimaryInstance()

切换到多主模式: Cluster.switchToMultiPrimaryMode()

切换到单主模式: cluster.switchToSinglePrimaryMode('172.16.1.125:3306')

6.6.7 8. 设置InnoDB Cluster的选项

​ 可以联机查看或修改集群设置。Cluster.options检查群集的当前设置:

var cluster=dba.getCluster("mailCluster")

cluster.options({all:true})

Cluster.setOption(option, value)用于全局更改所有群集实例的设置或群集全局设置:

 cluster.setOption('clusterName','procCluster')

Cluster.setInstanceOption(instance, option, value)用于更改各个集群实例的设置:

cluster.setInstanceOption('node02:3306', 'exitStateAction', 'READ_ONLY')

6.7 mycat连接mysqlrouter

一、问题

MyCat是一个基于MySQl协议的开源的分布式中间件,其核心是分库分表。

但是目前MyCat仍主要面对MySql 5.5, 5.6, 5.7版,对最新的MySql 8尚未完全支持,需要用户对MySql 8和MyCat的配置进行一系列的修改。

根据自己的测试结果,对这些修改进行简要的总结。

二、关于MySql 8

主要是修改Mysql配置文件,在Windows平台是my.ini,在linux平台是my.cnf:

  • 修改缺省加密方式:在安装完MySql 8后,需将缺省的加密方式修改为mysql_native_password,以保持与5.x版本兼容。
  • 如果是在Linux平台,在首次启动前设置lower_case_table_names = 1(表名大小写不敏感),注意一旦数据库中已有数据,再如此设置会导致启动mysql失败。
  • 为防止出现字符集不匹配,最好也显式设置字符集(可选)。

以下是本人使用的my.cnf:

[mysqld]
...
default-authentication-plugin=mysql_native_password
lower_case_table_names=1
character-set-server=utf8

[mysql]
default-character-set=utf8 

三、关于MyCat

主要涉及三个方面。

  • 登录逻辑库的方式

Mycat登录逻辑库的传统方式是:mysql -uroot -p -h127.0.0.1 -P8066 -DTESTDB

但对于MySql 8,会报密码错误方式,这是由于Mysql 8的缺省加密方式已经改为caching_sha2_password,而MyCat对此尚不支持。为此,需加上--default_auth=mysql_native_pasowrd选项:

mysql -uroot -p -h127.0.0.1 -P8066 -DTESTDB --default_auth=mysql_native_pasowrd

这样才能成功登录逻辑库。

  • 替换自带的JDBC驱动jar

MyCat自带的JDBC驱动jar还是5.1.x版的,若使用JDBC连接MySql 8,会报错“java.sql.SQLException: Unknown system variable 'query_cache_size'”。必须用8.0.x版的JDBC驱动jar代替才行,本人使用的

[mysql8Connector下载地址](http://central.maven.org/maven2/mysql/mysql-connector-java/8.0.11/ mysql-connector-java-8.0.11.jar)

chmod 777 mysql-connector-java-8.0.16.jar 
  • 修改 修改schema.xml 中jdbc时的url及dbDriver
dbDriver="jdbc"  ## 原来是native

如果dataHost的driverType为JDBC,则还需要修改url,增加useSSL=false和serverTimezone=UTC选项,某些情况下还需加上characterEncoding=utf8选项(可选),例如:

url="jdbc:mysql://192.168.64.187:3306?useSSL=false&amp;serverTimezone=UTC&amp; characterEncoding=utf8"
  • 修改server.xml

<property name="useHandshakeV10">1</property>  <!--(这里记得修改)-->

修改为1,不然你用JDBC连接MYCAT的时间连接不上

六.web服务器配置

需要安装:nginx ,nfs client,keepalived等

硬盘配置:500G 4C 8G

1.nginx安装

1.1.yum安装rpm:

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

yum install nginx

1.2.yum 下载,rpm安装:适用于其它机器无法上网的情况

yum -y install --downloadonly --downloaddir=/software nginx

scp nginx-1.16.1-1.el7.ngx.x86_64.rpm root@192.168.9.173:/root

或ansible执行:

ansible web -m copy -a 'src=/root/software/nginx-1.16.1-1.el7.ngx.x86_64.rpm dest=/tmp/ backup=yes mode=0777 owner=root group=root'

ansible web -m shell -a "rpm -ivh nginx-1.16.1-1.el7.ngx.x86_64.rpm "

1.3 yum 直接安装

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
ansible web -m yum -a 'name=nginx state=present'

2.jdk安装

ansible all -m copy -a 'src=/root/software/jdk-8u172-linux-x64.rpm dest=/tmp/ backup=yes mode=0777 owner=root group=root'

ansible all-m shell -a "rpm -ivh jdk-8u172-linux-x64.rpm "

3.检查状态

检查web服务器硬盘使用情况,并保存结果到本地文件

ansible -m command -a "df -Th" web > command-output.txt

4.ntp 安装配置

ntp web -m yum -a "name=ntpd state=present"
vim ntpConfig.sh
sed -i '/^server 172.30/d' /etc/ntp.conf
sed -i '$a  'server 172.30.120.4' /etc/ntp.conf
chmod +x ntpConfig.sh
ansible web -m scripts -a "ntpConfig.sh"
hwclock --systohc

5.安装 lsof,net-tools,telnet,vim

脚本安装:

vim installSoftware.sh
yum install -y lsof net-tools,telnet vim
chmod +x installSoftware.sh
ansible web -m script -a "installSoftware.sh"

yum直接安装

 ansible web -m yum -a "name=fontconfig state=present"

七.jumpserver

生成随机密钥的命令:后面的8是长度,可视需要输入.

cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 8

你的数据库密码是 9UdYkk5scWZPMROYr6fCWrAy 你的SECRET_KEY是 CTdOXDwG1evqlti1jUQY2ajT8cLpfLyUK8rueSTHfHLJB2NVKe 你的BOOTSTRAP_TOKEN是 5QJ71flbddt1AqXE 你的服务器IP是 193.169.1.87 请打开浏览器访问 http://193.169.1.87 用户名:admin 密码:admin

https://docs.jumpserver.org/zh/master/setup_by_localcloud.html

八 glusterfs安装

详见glusterDfs.md

client:172.30.120.52 dir :/glusterdir

1
https://gitee.com/zhrun8899/learning-notes.git
git@gitee.com:zhrun8899/learning-notes.git
zhrun8899
learning-notes
learning-notes
master

搜索帮助