1 基础理论
1.1 群集的概念
群集由两个或多个计算机(节点或成员)组成一起执行任务的系统
1.2 群集的分类
1.2.1 存储型(Storage)
提供一致的文件系统映象,允许服务器同步读写单个文件系统(通过Red Hat GFS提供存储群集功能)
1.2.2 高可用型(High Availability)
消除单点故障并将故障自动恢复(服务自动迁移到一个正常的节点),提供服务可持续的服务。
1.2.3 负载均衡型(Load balancing)
将网络服务请求分摊到多个群集节点来分摊负载,并提供单点失效检测并平滑将服务转移至正常节点。
1.2.4 高性能型(High performance)
群集通过多节点执行并行运算来提高应用程序性能。
1.3 群集的基础结构
1.3.1 群集管理
Cluster Manager简称CMAN
- CMAN是一个分布式群集管理工具
- CMAN用于管理群集的成员、消息和通知
- CMAN监控每个节点的运行状态来了解节点成员之间的关系
- CMAN负责通知底层进而做出相应的调整
Quorum
- 以太网消息决定(由节点票vote的50%加1组成)
- 以太网消息和quorum磁盘决定(由用户指定的条件组成)
1.3.2 锁管理
Distributed Lock Manager(DLM)分布式锁管理器
- DLM运行于集群中的每个节点
- GFS通过锁管理器的锁机制来同步访问文件系统元数据
- CLVM通过锁管理器来同步更新数据到LVM卷和卷组
1.3.3 Fencing
当CMAN认为某个节点已经发生故障,他将告知其他集群基础构件并在收到通知后对故障设备进行保护
保护方法:
- Power fencing(电源保护),控制电源关闭不可用节点
- Fibre Channel switch fencing(光钎通道开关保护),禁用不可用节点的光钎通道端口
- GNBD fencing
- 其他保护,禁I/O或不可用节点电源(IBM Bladecenters,PAP,DRAC/MC,HP ILO,IPMI,IBM RSAII等)
1.3.4 配置文件管理
Cluster Configuration System(CCS),用于群集配置文件管理与配置文件在个节点之间同步。
监控的配置文件(XML文件):
1
|
/etc/cluster/cluster
.conf
|
配置文件属性如下:
- 群集名,显示群集的名字、群集配置文件版本、当节点加入群集和被保护锁使用的基本保护时间属性
- 群集,显示群集的每个节点,指定节点名、节点ID、quorum vote的数量和其保护方法
- 保护设备,显示群集的保护设备和保护设备的具体参数
- 被管理的资源,显示创建群集所需要的资源(含故障切换与的定义、资源)
1.4 高可用性管理服务
1.4.1 rgmanager守护进程
实现off-the-shelf应用程序冷失效恢复(控制应用程序和群集资源来组成高可用性群集服务)
1.4.2 群集资源
如IP地址、应用程序初始化脚本或GFS共享分区等
1.4.3 故障切换域
有资格运行特定群集服务的节点子集(群集服务可运行和可迁移的节点称为一个切换域)
1.5 GFS
GFS是允许群集节点同时访问某个共享的块设备的群集文件系统
1.5.1 GFS的特点
- GFS是一个原生的文件系统
- GFS直接与Linux内核文件系统接口VFS层通讯
- GFS使用分布式元数据和多个日志来优化群集操作
- GFS使用锁管理器来协调I/O
- GFS节点中数据被修改,其他节点立马可见
- GFS提供配合(quota)和多重日子和多路径支持
- GFS提供良好的性能、灵活性和经济性
1.5.2 作用
- GFS提供节点间的数据共享
- GFS提供群集GFS节点单一和一致的文件系统命名空间视图
- GFS允许安装和运行应用程序而无需了解底层的存储基础结构
1.5.2 CLVM的守护进程
1
|
/etc/init
.d
/clvmd
|
1.6 群集逻辑卷管理器
Cluster Logical Volume Manager(CLVM),卷管理通过群集逻辑卷管理器进行管理
- clvmd,群集逻辑卷管理器守护进程
- HA-LVM,高可用性逻辑卷管理代理
1.7 全局网络块设备
Global Network Block Device(GNBD),提供通过TCP/IP访问GFS块设备的功能
1.7.1 GNBD client
GNBD客户端运行于GFS的节点上并提供基于光钎通道或single-initiator SCSI通道从GNBD服务导入块级别的设备
1.7.2 GNBD server
GNBD服务端允许从本地存储(直接附加存储或SAN存储)导出块级别设备
1.8 LVS
LVS提供两台以上的服务器之间的IP负载均衡能力(虚拟IP)
- 提供负载均衡能力
- 提供服务状态检测能力
1.8.1 LVS的工作原理
- pulse守护进程运行于活动或备份的LVS路由器上
- pulse定时发送heartbeat到活动路由器公共接口,确保路由器正常工作
- pulse启动lvs守护进程响应备份lvs路由的heartbeat查询
- lvs守护进程调用ipvsadm工具配置和维护内核的IPVS(IP虚拟服务器)路由表
- lvs为每台服务器配置的虚拟服务器启动一个nanny进程
- nanny进程检查一台真实服务器上的一个配置好的服务状态,并通告lvs守护进程服务器的当前状态
- lvs检测到真实服务器nanny进程通告的故障则会指引ipvsadm从ipvs路由表中删除真实的服务器条目
- 备份路由没有收到lvs路由的响应,执行初始化故障切换
- 备份路由调用send_arp将所有虚拟IP地址重新分配给备份LVS路由的MAC地址
- 备份路由通过专用或公用的接口向活动LVS路由器发送关闭lvs守护进程命令
- 备份路由通过启动lvs守护进程来接受虚拟服务器的请求
1.8.2 LVS的架构
- LVS路由层(含活动路由和备用路由,连接公共网络和专用网络)
- 真实服务器层(连接专用网络)
1.8.3 负载均衡算法
- Round-Robin Scheduling(轮询调度),按顺序分发请求到各真实服务器
- Weighted Round-Robin Scheduling(加权轮询调度),按权重给予性能好服务器更多请求处理机会
- Least-Connection Scheduling(最小连接调度),给予请求处理较少的服务器分配跟多的请求
- Weighted Least-connection(权重最小连接调度),基于负载数按权重调整给性能好服务器更多的请求
- Locality-Based Least-Connection Scheduling(基于局部性的最小连接调度) ,
根据请求的单台服务器目的IP少的给予更多分配
- Locality-Based Least-Connection Scheduling with Replication Scheduling
(带复制的基于局部最小连接调度),
同上,但使用IP地址服务器子集管理,超载服务器从子集删除,服务器池中连接少的加入子集。
- Source Hash Scheduling(源此地址散列调度),
按静态散列表查找源IP地址将请求发送到服务器池
1.8.4 服务器状态检测
- 调用send/expect scripts动态检测服务器状态
- 调用外部程序检测服务器状态
1.8.5 路由方法
- Network Address Translation(NAT),网络地址转换(有瓶颈问题)
- 直接路由(只处理转入的数据包)
1.8.6 持久性和防火墙标记
- persistence,lvs指定时间内记住最后的连接,并把请求定位到最后一次连接的服务器
- firewall mask,比较适合处理ftp这种根据端口进行连接分组情况
1.9 群集管理工具
1.9.1 Conga
提供WEB界面配置和管理群集和存储的软件组件
Conga的组件:
- luci,运行于管理端,通过ricci与多个群集和机器通讯,包含三个功能
- homebase,提供添加、删除机器和用户及配置用户权限的工具
- cluster,提供创建和配置群集的工具
- storage,提供远程管理存储设备的工具
- ricci,运行于群集中的每台机器
1.9.2 群集的管理图形界面
Cluster Configuration Tool以分层结构的形式在面板左边显示配置文件(/etc/cluster/cluster.conf)的群集配置
- Cluster Nodes,显示群集节点
- Fence Devices,显示保护设备
- Managed Resources,显示故障切换与、资源和服务
- Failover Domains,配置一个或多个群集节点子集
- Resource,配置用于高可用性服务的共享资源
- Services,创建和配置高可用服务
1.9.3 群集的命令行工具
- ccs_tool,群集配置工具
- cman_tool,群集管理工具
- fence_tool,保护工具
- clustat,群集状态工具
- clusvcadm,群集用户服务管理工具
1.10 服务的端口
2 实践部分
2.1 环境信息
2.1.1 业务与管理网络
vip=10.168.0.50
rhcsh01:
ipaddress=10.168.0.51/24
gateway=10.168.0.1
device=eth0
hostname=node01.cmdschool.org
OS=CentOS 6.8
rhcsh02:
ipaddress=10.168.0.52/24
gateway=10.168.0.1
device=eth0
hostname=node02.cmdschool.org
OS=CentOS 6.8
rhcsm:
ipaddress=10.168.0.59
gateway=10.168.0.1
device=eth0
hostname=rhcsm.cmdschool.org
OS=CentOS 6.8
storage:
ipaddress=10.168.0.200
gateway=10.168.0.1
device=eth0
hostname=storage01.cmdschool.org
OS=CentOS 7.1
2.1.2 存储网络
node01(rhcsh01):
ipaddress=10.0.0.51/24
device=eth1
node02(rhcsh02):
ipaddress=10.0.0.52/24
device=eth1
storage:
ipaddress=10.0.0.200/24
device=eth1
2.1.3 心跳网络
node01(rhcsh01):
ipaddress=192.168.1.51/24
device=eth2
node02(rhcsh02):
ipaddress=192.168.1.52/24
device=eth2
rhcsm:
ipaddress=192.168.1.59/24
device=eth2
2.2 环境配置
2.2.1 关闭selinux
In rhcsh0[1-2] & rhcsm:
1
|
getenforce
|
如显示如下:
1
|
Enforcing
|
则执行
1
2
|
setenforce 0
sed
-i
's/SELINUX=enforcing/SELINUX=disabled/g'
/etc/selinux/config
|
2.2.2 关闭防火墙
In rhcsh0[1-2] & rhcsm
1
2
|
/etc/init
.d
/iptables
stop
chkconfig iptables off
|
2.2.3 名称解析配置
In rhcsh0[1-2] & rhcsm & storage:
1
|
vim
/etc/hosts
|
输入如下内容:
1
2
3
|
192.168.1.51 node01.cmdschool.org
192.168.1.52 node02.cmdschool.org
192.168.1.59 rhcsm.cmdschool.org
|
2.2.4 时间与时区配置
In rhcsh0[1-2] & rhcsm & storage:
1)时区配置
1
|
cp
/usr/share/zoneinfo/Asia/Shanghai
/etc/localtime
|
2)安装ntp同步服务
1
|
yum
install
-y chrony
|
3)启动ntp服务
1
2
3
4
5
6
|
#CentOS 6
/etc/init
.d
/chronyd
start
chkconfig chronyd on
#CentOS 7
systemctl start chronyd
systemctl
enable
chronyd
|
4)同步时间
1
|
chronyc sources
|
2.3 存储服务配置
In storage:
2.3.1 创建存储分区(200G)
1
|
fdisk
/dev/sdb
|
详细向导如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
Welcome to
fdisk
(util-linux 2.23.2).
Changes will remain
in
memory only,
until
you decide to write them.
Be careful before using the write
command
.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xe381cdb3.
Command (m
for
help): n
Partition
type
:
p primary (0 primary, 0 extended, 4
free
)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-419430399, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-419430399, default 419430399):
Using default value 419430399
Partition 1 of
type
Linux and of size 200 GiB is
set
Command (m
for
help): w
The partition table has been altered!
Calling ioctl() to re-
read
partition table.
Syncing disks.
|
检查新建的分区
1
2
|
partprobe
ll
/dev/sdb
*
|
2.3.2 安装iscsi服务端相关包
1
|
yum -y
install
targetcli
|
2.3.3 启动服务并配置默认启动
1
2
|
systemctl
enable
target
systemctl restart target
|
2.3.4 配置存储服务
1
|
targetcli
|
详细向导如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/>help
/>
ls
/>
/backstores/block
create dev=
/dev/sdb1
name=scan1
/>
ls
/>
/iscsi
create wwn=iqn.2014-11.org.cmdschool:storage01
/>
ls
/>
cd
/iscsi/iqn
.2014-11.org.cmdschool:storage01
/tpg1/
/iscsi/iqn
.20...:storage01
/tpg1
>
ls
/iscsi/iqn
.20...:storage01
/tpg1
>acls/ create wwn=iqn.2014-11.org.cmdschool:node
/iscsi/iqn
.20...:storage01
/tpg1
>
ls
/iscsi/iqn
.20...:storage01
/tpg1
>luns/ create
/backstores/block/san1
/iscsi/iqn
.20...:storage01
/tpg1
>
cd
/
/>
ls
/>saveconfig
/>
exit
|
检查配置
1
|
vim
/etc/target/saveconfig
.json
|
2.3.5 防火墙配置
1
2
|
firewall-cmd --permanent --add-port=3260
/tcp
firewall-cmd --reload
|
2.4 节点链接iscsi存储
In rhcsh0[1-2]:
2.4.1 安装基础包
1
|
yum
install
-y iscsi* tree
|
2.4.2 配置服务默认启动
1
|
chkconfig iscsid on
|
2.4.3 修改配置
1
|
vim
/etc/iscsi/initiatorname
.iscsi
|
输入如下内容:
1
|
InitiatorName=iqn.2014-11.org.cmdschool:node
|
2.4.4 发现scsi存储
1
|
iscsiadm -m discovery node -t st -p 10.0.0.200:3260
|
校验
1
|
tree
/var/lib/iscsi/
|
显示如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/var/lib/iscsi/
├── ifaces
├── isns
├── nodes
│ └── iqn.2014-11.org.cmdschool:storage01
│ └── 10.0.0.200,3260,1
│ └── default
├── send_targets
│ └── 10.0.0.200,3260
│ ├── iqn.2014-11.org.cmdschool:storage01,10.0.0.200,3260,1,default ->
/var/lib/iscsi/nodes/iqn
.2014-11.org.cmdschool:storage01
/10
.0.0.200,3260,1
│ └── st_config
├── slp
└── static
|
2.4.5 检查存储发现情况
1
|
fdisk
-l
|
可发现新增加的硬盘
1
2
3
4
5
6
7
|
[...]
Disk
/dev/sdb
: 214.7 GB, 214747316224 bytes
255 heads, 63 sectors
/track
, 26108 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical
/physical
): 512 bytes / 512 bytes
I
/O
size (minimum
/optimal
): 512 bytes / 4194304 bytes
Disk identifier: 0x00000000
|
注:如果无法发现请执行重启操作
2.4.6 分区并格式化存储(单节点做即可)
1)存储分区
1
|
fdisk
/dev/sdb
|
向导如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x62b02e8b.
Changes will remain
in
memory only,
until
you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (
command
'c'
) and change display
units
to
sectors (
command
'u'
).
Command (m
for
help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-26108, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-26108, default 26108):
Using default value 26108
Command (m
for
help): w
The partition table has been altered!
Calling ioctl() to re-
read
partition table.
Syncing disks.
|
2)存储格式化
1
|
mkfs.ext4
/dev/sdb1
|
2.4.7 删除iscsi存储(无需执行)
1
2
3
4
|
iscsiadm -m session -i
/dev/sdb
iscsiadm -m node --logoutall=all
iscsiadm -m node -o delete -T iqn.2014-11.org.cmdschool:storage01 -p 10.0.0.200
iscsiadm -m session
|
2.5 节点配置
In rhcsh0[1-2]
2.5.1 安装yum源
1
|
yum groupinstall
"High Availability"
"Resilient Storage"
|
2.5.2 配置认证密码
1
|
passwd
ricci
|
2.5.3 启动服务并配置默认启动
1
2
|
/etc/init
.d
/ricci
start
chkconfig ricci on
|
2.6 MySQL安装配置
2.6.1 yum源安装
In rhcsh0[1-2]:
1
|
yum
install
-y mysql mysql-devel mysql-server
|
2.6.2 配置数据库
1)修改数据库目录
In rhcsh0[1-2]:
1
|
vim
/etc/my
.cnf
|
加入如下参数
1
2
3
|
[mysqld]
bind-address=10.168.0.50
datadir=
/data
|
2)修改目录权限
In rhcsh0[1-2]:
1
|
chown
-R mysql:mysql
/data/
|
3)启动服务
In rhcsh01:
1
|
/etc/init
.d
/mysqld
start
|
4)初始化服务
In rhcsh01:
1
|
mysql_secure_installation
|
向导如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[...]
Set root password? [Y
/n
] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
[...]
Remove anonymous
users
? [Y
/n
] y
... Success!
[...]
Disallow root login remotely? [Y
/n
] n
... skipping.
[...]
Remove
test
database and access to it? [Y
/n
] y
- Dropping
test
database...
... Success!
- Removing privileges on
test
database...
... Success!
[...]
Reload privilege tables now? [Y
/n
] y
... Success!
Cleaning up...
[...]
|
5)停止服务
In rhcsh01:
1
|
/etc/init
.d
/mysqld
stop
|
2.7 集群luci管理器配置
In rhcsm:
2.7.1 安装yum源
1
|
yum groupinstall -y
"High Availability Management"
|
2.7.2 启动luci管理器并配置开机启动
1
2
|
/etc/init
.d
/luci
start
chkconfig luci on
|
2.7.3 浏览器测试
注:以上使用系统帐号登录
2.8 luci管理器操作
In client:
2.8.1 创建群集并添加节点
1)创建群集
2)创建完成
2.8.2 创建故障域
1)创建故障域
2)创建完成
2.8.3 添加资源-虚拟IP
1)添加虚拟IP
2)添加完成
2.8.4 集群的服务组-添加虚拟IP资源
1)添加虚拟IP资源到群集服务组
2)添加完成
3)客户端验证
4)节点验证
2.8.5 集群的服务组-添加共享硬盘资源
1)添加共享硬盘资源
2)选择集群服务组
3)往集群组添加共享磁盘
4)验证共享磁盘挂载
2.8.6 集群的服务组-添加数据库服务资源
1)添加MySQL服务到资源
2)添加完成显示
3)选择群组
4)往群集组添加资源-MySQL服务
5)添加完毕显示
6)验证