真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

基于centos7的Redis群集原理及配置-創(chuàng)新互聯(lián)

博文大綱:
一、Redis群集原理
二、Redis群集架構(gòu)細(xì)節(jié)
三、redis-cluster選舉
四、部署Redis群集環(huán)境

超過(guò)十多年行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì),成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,小程序制作,微信開(kāi)發(fā),重慶APP開(kāi)發(fā),同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷和我們一樣獲得訂單和生意!

關(guān)于Redis的性能調(diào)優(yōu)參數(shù)的說(shuō)明,可以參考博文:centos 7之Redis數(shù)據(jù)庫(kù)詳解及參數(shù)調(diào)優(yōu)
一、Redis群集原理:

1)Redis集群架構(gòu):

  • Redis Cluster采用虛擬槽分區(qū),將所有的數(shù)據(jù)根據(jù)算法映射到0~16384整數(shù)槽內(nèi)
  • Redis Cluster是一個(gè)無(wú)中心的結(jié)構(gòu)
  • 每個(gè)節(jié)點(diǎn)都保存數(shù)據(jù)和整個(gè)集群的狀態(tài)
    2)集群角色
  • Master:Master之間分配slots
  • Slave:Slave向它指定的Master同步數(shù)據(jù)
    3)集群節(jié)點(diǎn)使用的TCP端口
  • 6379端口用于客戶端的連接
  • 16379端口用于群集總線

Redis3.0版本以上開(kāi)始支持群集,采用的是hash slot(哈希槽),可以將多個(gè)Redis實(shí)例整合在一起,形成一個(gè)群集,也就是將數(shù)據(jù)分散到群集的多臺(tái)服務(wù)器上。

Redis cluster(Redis 群集)是一個(gè)無(wú)中心的結(jié)構(gòu),如下圖所示,每個(gè)節(jié)點(diǎn)都會(huì)保存數(shù)據(jù)和整個(gè)群集的狀態(tài)。每個(gè)節(jié)點(diǎn)都會(huì)保存其他節(jié)點(diǎn)的信息,知道其他節(jié)點(diǎn)所負(fù)責(zé)的槽,并且會(huì)與其他節(jié)點(diǎn)定時(shí)發(fā)送心跳信息,能夠及時(shí)感知群集中異常的節(jié)點(diǎn)。

基于centos 7的Redis群集原理及配置

當(dāng)客戶端向群集中任一節(jié)點(diǎn)發(fā)送與數(shù)據(jù)庫(kù)鍵有關(guān)的命令時(shí),接受命令的節(jié)點(diǎn)會(huì)計(jì)算出命令要處理的數(shù)據(jù)屬于哪個(gè)槽,并檢查這個(gè)槽是否指派給了自己,如果鍵所在的槽正好指派給了當(dāng)前節(jié)點(diǎn),那么節(jié)點(diǎn)直接執(zhí)這個(gè)命令;如果鍵值所在的槽并沒(méi)有指派給當(dāng)前節(jié)點(diǎn),那么節(jié)點(diǎn)會(huì)向客戶端返回一個(gè)MOVED錯(cuò)誤,指引客戶端轉(zhuǎn)向(redirect)正確的節(jié)點(diǎn),并再次發(fā)送之前想要執(zhí)行的命令。

群集角色有master和slave。master之間分配slots,一共16384個(gè)slot。slave向它指定的master同步數(shù)據(jù),實(shí)現(xiàn)備份。當(dāng)其中一個(gè)master無(wú)法提供服務(wù)時(shí),該master的slave將提升為master,以保證群集間slot的完整性。當(dāng)其中的某一個(gè)master和它的slave都失效,導(dǎo)致了slot不完整,群集失效,這時(shí)就需要運(yùn)維人員去處理了。

群集搭建好后,群集中的每個(gè)節(jié)點(diǎn)都會(huì)定期地向其他節(jié)點(diǎn)發(fā)送PING消息,如果接收PING消息的節(jié)點(diǎn)沒(méi)有在規(guī)定的時(shí)間內(nèi)返回PONG消息,那么發(fā)送PING消息的節(jié)點(diǎn)就會(huì)將其標(biāo)記為疑似下線(PFAIL)。各個(gè)節(jié)點(diǎn)會(huì)通過(guò)互相發(fā)送消息的方式來(lái)交換群集中各個(gè)節(jié)點(diǎn)的狀態(tài)信息。如果已經(jīng)在一個(gè)群集里面,半數(shù)以上的主節(jié)點(diǎn)都將某個(gè)主節(jié)點(diǎn)x報(bào)告為疑似下線,那么這個(gè)主節(jié)點(diǎn)x將被標(biāo)記為已下線(FAIL),同時(shí)會(huì)向群集廣播一條關(guān)于主節(jié)點(diǎn)x的FAIL消息,所有收到這條FAIL消息的節(jié)點(diǎn)都會(huì)立即將主節(jié)點(diǎn)x標(biāo)記為已下線。

當(dāng)需要減少或者增加群集中的服務(wù)器時(shí),我們需要將已經(jīng)指派給某個(gè)節(jié)點(diǎn)(源節(jié)點(diǎn))的槽改為指派給另一個(gè)節(jié)點(diǎn)(目標(biāo)節(jié)點(diǎn)),并且將相關(guān)槽所包含的鍵值對(duì)從源節(jié)點(diǎn)移動(dòng)到目標(biāo)節(jié)點(diǎn)。

Redis群集的重新分片操作時(shí)由Redis的群集管理軟件redis-trib負(fù)責(zé)執(zhí)行的,不支持自動(dòng)分片,而且需要自己計(jì)算從哪些節(jié)點(diǎn)遷移多少Slot。在重新分片的過(guò)程中,群集無(wú)需下線,并且源節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)都可以繼續(xù)處理命令請(qǐng)求。

二、Redis群集架構(gòu)細(xì)節(jié):

1、所有的Redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制)內(nèi)部使用二進(jìn)制協(xié)議優(yōu)先傳輸速度和帶寬。

2、節(jié)點(diǎn)的失效(fail)在群集中超過(guò)半數(shù)的主(master)節(jié)點(diǎn)檢測(cè)失效時(shí)才會(huì)生效。

3、客戶端與redis節(jié)點(diǎn)直連,不需要中間代理(proxy)層,客戶端不需要連接群集所有節(jié)點(diǎn),連接群集中任何一個(gè)可用節(jié)點(diǎn)即可。

4、redis-cluster把所有的物理節(jié)點(diǎn)映射到 [ 0-1638 ] slot 上,cluster負(fù)責(zé)維護(hù)node< - >slot< - > key。

三、redis-cluster選舉:

選舉過(guò)程是群集中所有master參與,如果半數(shù)以上master節(jié)點(diǎn)與當(dāng)前master節(jié)點(diǎn)通信超時(shí)(cluster-node-timeout),認(rèn)為當(dāng)前master節(jié)點(diǎn)掛掉。以下兩種情況為整個(gè)群集不可用(cluster_state:fail),當(dāng)群集不可用時(shí),所有對(duì)群集的操作都不可用,收到((error)CLUSTERDOWN Thecluster is down)錯(cuò)誤:

錯(cuò)誤1:如果群集中任意master掛掉,且當(dāng)前master沒(méi)有slave,則群集進(jìn)入fail狀態(tài),也可以理解成群集的slot映射 [ 0-16383 ]不完整時(shí)進(jìn)入fail狀態(tài)。

錯(cuò)誤2:如果群集中超過(guò)半數(shù)的master掛掉,無(wú)論是否有slave,群集都進(jìn)入fail狀態(tài)。

默認(rèn)情況下,每個(gè)群集的節(jié)點(diǎn)都是用兩個(gè)TCP端口,一個(gè)是6379,一個(gè)是16379;6379服務(wù)于客戶端的連接,16379用于群集總線,就是使用二進(jìn)制協(xié)議的節(jié)點(diǎn)到節(jié)點(diǎn)通信通道。節(jié)點(diǎn)使用群集總線進(jìn)行故障檢測(cè)、配置更新、故障轉(zhuǎn)移授權(quán)等。

四、部署Redis群集環(huán)境:

1、環(huán)境準(zhǔn)備:

1)六臺(tái)服務(wù)器,三臺(tái)為master、三臺(tái)為slave,我這里均為centos 7,IP地址依次為192.168.1.1--6(參與群集的服務(wù)器數(shù)量最好為偶數(shù),每個(gè)master會(huì)自動(dòng)對(duì)應(yīng)一個(gè)slave,若為奇數(shù),群集無(wú)法實(shí)現(xiàn)冗余,因?yàn)楸囟ㄓ幸粋€(gè)master沒(méi)有對(duì)應(yīng)的slave,一旦這個(gè)master宕機(jī),整個(gè)群集就會(huì)丟失一部分?jǐn)?shù)據(jù));
2)準(zhǔn)備所需源碼包:下載鏈接,提取碼:4kky,配置本地yum,需要系統(tǒng)映像安裝ruby的運(yùn)行環(huán)境。
3)自行配置網(wǎng)絡(luò)及防火墻,放行TCP的6379和16379這兩個(gè)端口的流量,我這里直接關(guān)閉了防火墻。
4)所有redis服務(wù)器必須保證無(wú)任何數(shù)據(jù),最好是全新安裝的,因?yàn)槿绻袛?shù)據(jù)存在,在后面進(jìn)行群集時(shí)會(huì)報(bào)錯(cuò),關(guān)于錯(cuò)誤如何解決,我沒(méi)有深究。

2、開(kāi)始部署:

①192.168.1.1:

[root@localhost ~]# mount /root/redis-5.0.iso /media 
mount: /dev/loop1 寫保護(hù),將以只讀方式掛載
[root@localhost ~]# cd /media
[root@localhost media]# cp * /usr/src/           #將iso中的文件都復(fù)制到指定目錄
[root@localhost media]# cd /usr/src
[root@localhost src]# ls               #查看相關(guān)包有沒(méi)有復(fù)制過(guò)來(lái)
debug  kernels  redis-3.2.0.gem  redis-5.0.5.tar.gz
[root@localhost src]# tar zxf redis-5.0.5.tar.gz       #解包
[root@localhost src]# cd redis-5.0.5/       #切換至解壓后的目錄
[root@localhost redis-5.0.5]# make && make install      #編譯安裝
[root@localhost redis-5.0.5]# cd utils/        #切換至子目錄
[root@localhost utils]# ./install_server.sh       #生成服務(wù)相關(guān)配置文件
#接下來(lái)是在指定相關(guān)配置文件的存放位置,直接一路按回車鍵即可。
[root@localhost utils]# cd /etc/init.d/      #優(yōu)化redis控制啟停方式
[root@localhost init.d]# mv redis_6379 redis     
[root@localhost init.d]# chkconfig --add redis          #將redis添加為系統(tǒng)服務(wù)
[root@localhost init.d]# systemctl restart redis          #重啟服務(wù),以測(cè)試是否生效
[root@localhost init.d]# systemctl restart redis
[root@localhost init.d]# vim /etc/redis/6379.conf    #編輯主配置文件,改動(dòng)以下幾個(gè)配置項(xiàng)
bind 127.0.0.1 192.168.1.1   #添加本機(jī)IP。
appendonly yes  #改為“yes”,以便在每次更新操作后進(jìn)行日志記錄,進(jìn)行數(shù)據(jù)同步寫入
daemonize yes       #查看是否為“yes”
logfile /var/log/redis_6379.log           #指定日志文件位置,可以保持默認(rèn)
cluster-enabled yes            #啟動(dòng)群集
cluster-config-file nodes-6379.conf          #群集配置文件
cluster-node-timeout 15000          #群集節(jié)點(diǎn)超時(shí)時(shí)間,單位為毫秒
cluster-require-full-coverage no          #將默認(rèn)的“yes”改為“no”
port 6379                  #默認(rèn)監(jiān)聽(tīng)的端口號(hào)
[root@localhost init.d]# systemctl restart redis        #重啟服務(wù),使配置生效
[root@localhost init.d]# netstat -anpt | grep redis       #只要6379和16379在監(jiān)聽(tīng),就OK了。
tcp        0      0 192.168.1.1:6379        0.0.0.0:*       LISTEN      7139/redis-server 1 
tcp        0      0 192.168.1.1:16379       0.0.0.0:*       LISTEN      7139/redis-server 1 
[root@localhost ~]# yum -y install ruby rubygems            #安裝ruby的運(yùn)行環(huán)境及客戶端
[root@localhost ~]# cd /usr/src/
[root@localhost src]# ls             #切換至包含redis-3.2.0.gem的目錄下
debug  kernels  redis-3.2.0.gem  redis-5.0.5  redis-5.0.5.tar.gz
[root@localhost src]# gem install redis --version 3.2.0      #執(zhí)行g(shù)em命令
Successfully installed redis-3.2.0
Parsing documentation for redis-3.2.0
Installing ri documentation for redis-3.2.0
1 gem installed

②192.168.1.2:

[root@localhost ~]# scp root@192.168.1.1:/usr/src/redis-5.0.5.tar.gz /usr/src
#將主機(jī)1.1的redis源碼包復(fù)制過(guò)來(lái)
The authenticity of host  192.168.1.1 (192.168.1.1) can t be established.
ECDSA key fingerprint is SHA256:3U5q5gBxEOkHLFZZueGnEXGV/LZA9M4+1rM1lLvkD1g.
ECDSA key fingerprint is MD5:ad:a1:9b:f7:e3:41:bf:5f:da:cd:5e:3f:74:e0:8a:b9.
Are you sure you want to continue connecting (yes/no)? yes #輸入yes
Warning: Permanently added '192.168.1.1' (ECDSA) to the list of known hosts.
root@192.168.1.1 s password:         #輸入主機(jī)1.1的用戶密碼
redis-5.0.5.tar.gz                              100% 1929KB  68.5MB/s   00:00   
[root@localhost ~]# cd /usr/src                 
[root@localhost src]# tar zxf redis-5.0.5.tar.gz         #解包
[root@localhost src]# cd redis-5.0.5/          #進(jìn)入解壓后的目錄
[root@localhost redis-5.0.5]# make && make install       #編譯安裝
[root@localhost redis-5.0.5]# cd utils/        #切換至子目錄
[root@localhost utils]# ./install_server.sh       #生成服務(wù)相關(guān)配置文件
#接下來(lái)是在指定相關(guān)配置文件的存放位置,直接一路按回車鍵即可。
[root@localhost utils]# cd /etc/init.d/      #優(yōu)化redis控制啟停方式
[root@localhost init.d]# mv redis_6379 redis     
[root@localhost init.d]# chkconfig --add redis          #將redis添加為系統(tǒng)服務(wù)
[root@localhost init.d]# systemctl restart redis          #重啟服務(wù),以測(cè)試是否生效
[root@localhost init.d]# scp root@192.168.1.1:/etc/redis/6379.conf /etc/redis/ 
#將主機(jī)1.1的redis配置文件復(fù)制過(guò)來(lái)
root@192.168.1.1 s password: 
6379.conf                                       100%   60KB  34.5MB/s   00:00    
[root@localhost init.d]# scp root@192.168.1.1:/etc/redis/6379.conf /etc/redis/    #編輯配置redis配置文件
bind 127.0.0.1 192.168.1.2         #將原有的1.1改為1.2即可
[root@localhost init.d]# systemctl restart redis          #重啟服務(wù),使配置文件生效
[root@localhost init.d]# netstat -natp | grep redis      #查看6379和16379是否在監(jiān)聽(tīng)
tcp        0      0 192.168.1.2:6379        0.0.0.0:*       LISTEN      7479/redis-server 1 
tcp        0      0 192.168.1.2:16379       0.0.0.0:*     LISTEN      7479/redis-server 1

現(xiàn)在192.168.1.2也配置完成了,現(xiàn)在去192.168.1.3-6重復(fù)執(zhí)行一下192.168.1.2這臺(tái)主機(jī)的配置即可。需要注意的是,更改從1.1復(fù)制過(guò)來(lái)的主配置文件時(shí),將對(duì)應(yīng)的IP地址換成本機(jī)的IP地址即可,其他配置命令都一樣。

剩下的所有服務(wù)器都配置完成后,回過(guò)頭接著配置主機(jī)192.168.1.1:

[root@localhost src]# redis-cli --cluster create 192.168.1.1:6379 \
192.168.1.2:6379  \
192.168.1.3:6379  \
192.168.1.4:6379  \
192.168.1.5:6379  \
192.168.1.6:6379  \
--cluster-replicas 1
#創(chuàng)建群集,將所有節(jié)點(diǎn)添加到群集?!癨”表示折行繼續(xù)輸入,可以省略“\”,但要空格
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.5:6379 to 192.168.1.1:6379
Adding replica 192.168.1.6:6379 to 192.168.1.2:6379
Adding replica 192.168.1.4:6379 to 192.168.1.3:6379
M: 758dc679fc1d46df195b4c16abcfde1d743b8008 192.168.1.1:6379
   slots:[0-5460] (5461 slots) master
M: 4b1d119d0a8179afcc10bf5891e5c04e6a7054ba 192.168.1.2:6379
   slots:[5461-10922] (5462 slots) master
M: 58d342b59e98c9f9f469332b08c36b6ddd456bf6 192.168.1.3:6379
   slots:[10923-16383] (5461 slots) master
S: bb95619aff3d613137733eeb55ff2d303a8720a1 192.168.1.4:6379
   replicates 58d342b59e98c9f9f469332b08c36b6ddd456bf6
S: 22d77a79272847f29e5db381b98ef6ccc4a169a7 192.168.1.5:6379
   replicates 758dc679fc1d46df195b4c16abcfde1d743b8008
S: ebc138bbea070c6496ae266b1a84936754603ad2 192.168.1.6:6379
   replicates 4b1d119d0a8179afcc10bf5891e5c04e6a7054ba
Can I set the above configuration? (type 'yes' to accept): yes            #輸入“yes”
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.....
>>> Performing Cluster Check (using node 192.168.1.1:6379)
M: 758dc679fc1d46df195b4c16abcfde1d743b8008 192.168.1.1:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: ebc138bbea070c6496ae266b1a84936754603ad2 192.168.1.6:6379
   slots: (0 slots) slave
   replicates 4b1d119d0a8179afcc10bf5891e5c04e6a7054ba
M: 4b1d119d0a8179afcc10bf5891e5c04e6a7054ba 192.168.1.2:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 58d342b59e98c9f9f469332b08c36b6ddd456bf6 192.168.1.3:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: bb95619aff3d613137733eeb55ff2d303a8720a1 192.168.1.4:6379
   slots: (0 slots) slave
   replicates 58d342b59e98c9f9f469332b08c36b6ddd456bf6
S: 22d77a79272847f29e5db381b98ef6ccc4a169a7 192.168.1.5:6379
   slots: (0 slots) slave
   replicates 758dc679fc1d46df195b4c16abcfde1d743b8008
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost src]# redis-cli --cluster check 192.168.1.1:6379   
#查看群集狀態(tài)
192.168.1.1:6379 (758dc679...) -> 0 keys | 5461 slots | 1 slaves.
192.168.1.2:6379 (4b1d119d...) -> 0 keys | 5462 slots | 1 slaves.
192.168.1.3:6379 (58d342b5...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.1:6379)
M: 758dc679fc1d46df195b4c16abcfde1d743b8008 192.168.1.1:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: ebc138bbea070c6496ae266b1a84936754603ad2 192.168.1.6:6379
   slots: (0 slots) slave
   replicates 4b1d119d0a8179afcc10bf5891e5c04e6a7054ba
M: 4b1d119d0a8179afcc10bf5891e5c04e6a7054ba 192.168.1.2:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 58d342b59e98c9f9f469332b08c36b6ddd456bf6 192.168.1.3:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: bb95619aff3d613137733eeb55ff2d303a8720a1 192.168.1.4:6379
   slots: (0 slots) slave
   replicates 58d342b59e98c9f9f469332b08c36b6ddd456bf6
S: 22d77a79272847f29e5db381b98ef6ccc4a169a7 192.168.1.5:6379
   slots: (0 slots) slave
   replicates 758dc679fc1d46df195b4c16abcfde1d743b8008
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost src]# redis-cli -h 192.168.1.1 -p 6379 -c          #登錄到群集需加“-c”選項(xiàng)
192.168.1.1:6379> set lv 11         #插入數(shù)據(jù)
OK
192.168.1.1:6379> get lv         
"11"
192.168.1.1:6379> exit
[root@localhost src]# redis-cli -h 192.168.1.3 -p 6379 -c          #登錄到其他master
192.168.1.3:6379> get lv           #查看在1.1插入的數(shù)據(jù),照樣可以查詢到,說(shuō)明群集生效
-> Redirected to slot [4118] located at 192.168.1.1:6379
"11"

redis-3.x.x和redis-5.x.x創(chuàng)建群集的區(qū)別:

使用命令不一樣,redis-3.x.x使用redis-trib.rb命令,語(yǔ)法如下:

[root@localhost ~]#redis-trib.rb create --replicas 1 192.168.1.1:6379 ..192.168.1.6:6379
#redis-3.x.x創(chuàng)建群集。
[root@localhost src]# redis-trib.rb check 192.168.1.1:6379
#查看群集狀態(tài)
# redis-trib.rb不可以直接使用,需要執(zhí)行以下操作才可直接使用
[root@localhost src]# cd /usr/src/redis-5.0.5/src/           
[root@localhost src]# cp redis-trib.rb /usr/local/bin/  
#將該腳本復(fù)制到本地../bin下,以便直接使用。若不然,需要在目錄下使用“./”執(zhí)行該文件

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


分享標(biāo)題:基于centos7的Redis群集原理及配置-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://weahome.cn/article/ijseg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部