cassandra从原理到实践


文章目录
一、分布式理论
CAP定理
BASE理论
数据模型
二、cassandra体系结构
1、体系结构
2、存储引擎
2、cassandra数据的读写操作原理
数据是如何写的?
读取请求流程?
如果压缩
配置虚拟节点
三、cassandra配置信息
1、jvm优化
2、cassandra.yaml
四、cql常用操作
1、CREATE KEYSPACE
2、CREATE ROLE
3、grant
4、REVOKE
5、DROP ROLE
6、alter keyspace
7、alter role
8、alter table
9、alter type
10、list
11、truncate
五、nodetool常用操作
nodetool status
nodetool snapshot
nodetool flush
nodetool repair
nodetool cleanup
nodetool gossipinfo
nodetool removenode
nodetool netstats
nodetool reloadseeds
nodetool drain
nodetool tablestats eo_cs.eo_name
nodetool compactionstats
nodetool enablebackup
nodetool gcstats
nodetool ring
nodetool statushandoff
六、Gossip通信协议
一、分布式理论
CAP定理
来源:https://zh.wikipedia.org/wiki/CAP定理

在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

一致性(Consistency):等同于所有节点访问同一份最新的数据副本。

可用性(Availability):每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据。

分区容错性(Partitiontolerance):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择[3]。

根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项[4]。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

BASE理论
基本可用(Basically Available):基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。例如:电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

软状态( Soft State):软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

最终一致性( Eventual Consistency):最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

数据模型
1.BigTable

2.Dynamo

二、cassandra体系结构
1、体系结构
关键组成部分:

node:
cluster
Datacenter
replication
commit log
SSTable
tombstone /'tuːmstəʊn/
CQL Table
Gossip
Partitioner 集群中的节点之间均匀分配数据以实现负载平衡。
replication factor
2、存储引擎
cassandra是log-structured engine,数据存储时,存储引擎将插入和更新的数据分组存储在内存中,并按照间隔顺序将数据以附加模式写入磁盘。一旦写入磁盘,则数据就不可变,也不会被覆盖。log-structured engine 可以避免覆盖并使用顺序I/O来更新数据,因此非常适合廉价的消费类SSD。

https://docs.datastax.com/en/ddac/doc/datastax_enterprise/dbArch/archPartitioners.html

2、cassandra数据的读写操作原理
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/dbInternals/dbIntIntro.html

数据是如何写的?
1、Logging data in the commit log
2、Writing data to the memtable
3、Flushing data from the memtable
4、Storing data on disk in SSTables


读取请求流程?


如果压缩


配置虚拟节点
https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/config/configVnodeTOC.html

启用vnodes
在cassandra.yaml文件中:

1、取消注释num_tokens并设置所需的令牌数。
2、(推荐)要使用分配算法,请取消注释allocate_tokens_for_local_replication_factor ,并将其设置为数据中心中键空间的目标复制因子。如果复制发生变化,则在复制因子(RF)设置之间切换。
3、注释掉initial_token或保留未设置状态。

要将现有群集升级到vnode,请参阅在现有生产群集上启用虚拟节点。

禁用vnodes

在cassandra.yaml文件中:
1、注释掉num_tokens和 allocate_tokens_for_local_replication_factor。
2、取消注释initial_token并将其设置为1 或多节点集群的生成标记的值。

三、cassandra配置信息
1、jvm优化
调整java虚拟机jvm可以提高性能优化或减少高内存消耗。默认使用垃圾优先回收器(G1)。

java垃圾回收器的设置,在jvm.options文件中:

1、注释掉GI Settings行,表示开启GI
2、注释掉 CMS Settings行,表示开启CMS
对于使用G1的节点,DataStax建议尽可能大的MAX_HEAP_SIZE,最高64 GB。

参考:https://docs.datastax.com/en/ddac/doc/datastax_enterprise/operations/opsTuneJVM.html

2、cassandra.yaml
常用参数的配置:

listen_address:默认值是localhost,数据库绑定ip或主机名,用于将此节点链接到其他节点。注意:禁止listen_address设置为0.0.0.0,不能同时设置listen_address或listen_interface。
commitlog_directory:存储提交日志的目录。
seed_provider:指定集群的seeds
data_file_directories:存储表叔的目录位置。
saved_caches_directory:存储表键和行高速缓存的目录位置
incremental_backups:默认值false,备份上次拍摄快照以来更新的数据。
性能属性:

commitlog_sync:默认值periodic,用于以毫秒为单位确认写入。
commitlog_sync_period_in_ms:默认值10000,配合commitlog_sync的periodic。控制提交日志与磁盘同步的频率。
commitlog_segment_size_in_mb:默认值:32,单位MB,表示单个commitlog文件大小。用于将所有数据刷新到SSTable后,可以对提交日志段进行存档、删除、回收。
memtable_flush_writers:刷新写入程序的线程数,这些线程被磁盘I/O阻塞,每个线程在被阻塞时内存中保存一个memtable。SSD时增加此参数值,默认值2,最大值8。
memtable_heap_space_in_mb:默认值堆大小的1/4,为memtbles分配堆内存量。
memtable_offheap_space_in_mb:默认值堆大小的1/4,为memtbles分配堆外内存量。memtable_offheap_space_in_mb和memtable_heap_in_mb的值来自动memtable flush的阈值。
trickle_fsync:默认值true。设置为true时,会导致操作系统以设置的间隔trickle_fsync_interval_in_kb刷新脏页缓冲区。启动该参数可防止突发脏页缓冲区刷新影响读取延迟。建议在ssd开启,HDD关闭。
使用端口

trickle_fsync_interval_in_kb:默认值:1024.以千字节为单位的大小fsync。

storage_port:默认值7000.节点间通信的端口。

native_transport_port:默认值:9042.cql传输监听客户端的端口。

rpc_port:默认值:9160.用于客户端的Thrift端口

ssl_storage_port:默认值:7001。用于加密通信的SSL端口。除非在encryption_options中启用,否则不使用。

native_transport_port_ssl:默认值:9142。如果启用了客户端加密并且禁用了native_transport_port_ssl,则native_transport_port(默认值:9042)将加密所有流量。要同时使用未加密和加密的流量,请启用native_transport_port_ssl。

auto_snapshot:默认值 true。设置为true时,当数据库库在截断keyspace或删除表之前获取数据快照。建议设置为true,防止数据丢失。

key_cache_save_period:默认值14400.(4小时)keys存在缓存中的时间(以秒为单位),缓存保存在saved_caches_directory。保存在缓存中减少了冷启动时的I/O影响,提高启动速度。

slow_query_log_timeout_in_ms:默认值:500,节点记录慢日志。选择超过此值的查询会生成聚合日志消息以识别慢速查询。禁用设置0.

internode_authenticator:默认值:AllowAllAuthorizer,禁用授权,cassandra不需要认证。值为CassandraAuthorizer,表示存储system_auth.permissions表中的权限,当system_auth系统keyspace复制因子为1,则无法访问集群,因此当设置CassandrAuthorizer时,修改system_auth的复制因子。多数据中心,确保复制设置为NetworkTopologyStrategy。

设置vnode:

num_tokens:为虚拟节点令牌体系结构设置此属性。确定要分配给此虚拟节点(vnode)的令牌范围数。使用1到128之间的数字,其中 1禁用vnodes。当令牌号在数据中心中的节点之间变化时,vnode逻辑分配相对于数据中心中的其他节点的比例数量的范围。通常,如果所有节点具有相同的硬件能力,则每个节点应具有相同的 num_tokens值。
allocate_tokens_for_local_replication_factor:将vnode添加到现有群集或在新数据中心中设置节点时,请设置为数据中心中键空间的目标复制因子(RF)。触发推荐 的RF和 算法分配num_tokens对于这个节点。分配算法尝试以优化指定RF的数据中心节点上的复制负载的方式选择令牌。分配给每个节点的负载接近于vnode的数量。
如果allocate_tokens_for_local_replication_factor 也被注释掉,则启用随机算法 。

vnodes配置
启用vnodes

在cassandra.yaml文件中:
1、取消注释num_tokens并设置所需的令牌数。
2、(推荐)要使用分配算法,请取消注释allocate_tokens_for_local_replication_factor ,
并将其设置为数据中心中键空间的目标复制因子。如果复制发生变化,
则在复制因子(RF)设置之间切换。
3、注释掉initial_token或保留未设置状态。


禁用vnodes

在cassandra.yaml文件中:
1、注释掉num_tokens和 allocate_tokens_for_local_replication_factor。
2、取消注释initial_token并将其设置为1 或多节点集群的生成标记的值。

https://docs.datastax.com/en/ddac/doc/datastax_enterprise/config/configCassandra_yaml.html

四、cql常用操作
1、CREATE KEYSPACE
CREATE KEYSPACE eo_cs WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': '3'}  AND durable_writes = true;

2、CREATE ROLE
语法:
CREATE ROLE [IF NOT EXISTS] role_name [WITH SUPERUSER = true | false | LOGIN = true | false | PASSWORD = ‘password’ | OPTIONS = option_map]

create ROLE eocs WITH SUPERUSER = false and password = ‘eocs’ and login=true;

3、grant
语法:
GRANT privilege ON resource_name TO role_name

GRANT all PERMISSIONS ON KEYSPACE eo_cs  TO eocs;
GRANT select  ON KEYSPACE eo_cs  TO eocs;

privilege选项:all permissions、alter、authorize、create、describe、execute、modify、select

4、REVOKE
REVOKE AUTHORIZE on KEYSPACE  eo_cs from eocs;

5、DROP ROLE
语法:
drop role [if exists] role_name;

6、alter keyspace
语法:
ALTER KEYSPACE keyspace_name 
WITH REPLICATION = {‘class’ : ‘SimpleStrategy’, ‘replication_factor’ : N 
| ‘class’ : ‘NetworkTopologyStrategy’, ‘dc1_name’ : N [, …]} 
[AND DURABLE_WRITES = true|false] ;

CREATE KEYSPACE eo_im WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': '3'}  AND durable_writes = true;

DURABLE_WRITES:(可选)(不推荐),通过禁用持久写入(DURABLE_WRITES = false)来写入键空间时绕过提交日志。默认值是true。
小心:使用SimpleStrategy复制时,不要禁用持久写入。
7、alter role
语法: alter role role_name [with [password = ‘yourpassword’] [login = true|false] [superuser = true|false] [options = map_literal]]

password:更改密码
superuser:为其他启动或禁用超级用户状态,不能是当前登录的角色。将超级用户设置为false,撤销创建新角色的权限,但不会撤销已存在的authorize,alterhe drop权限。
login:启动或禁用当前角色以外的登录权限
8、alter table
语法:
ALTER TABLE [keyspace_name.] table_name
[ALTER column_name TYPE cql_type]
[ADD (column_definition_list)]
[DROP column_list | COMPACT STORAGE ]
[RENAME column_name TO column_name]
[WITH table_properties];

9、alter type
语法:
ALTER TYPE field_name
[ALTER field_name TYPE new_cql_datatype
| ADD (field_name cql_datatype[,…])
| RENAME field_name TO new_field_name[AND …]]

10、list
list 选项:
[ALL | ALTER | AUTHORIZE | CREATE | DESCRIBE | DROP | EXECUTE | MODIFY | ROLES | SELECT | USERS]

cassandra@cqlsh> list  select;

 role      | username  | resource           | permission
-----------+-----------+--------------------+------------
 cassandra | cassandra | <keyspace eeotest> |     SELECT
 cassandra | cassandra |   <keyspace eo_cs> |     SELECT
 cassandra | cassandra |   <keyspace eo_im> |     SELECT
     eo_im |     eo_im |   <keyspace eo_im> |     SELECT
      eocs |      eocs |   <keyspace eo_cs> |     SELECT


11、truncate
立即且不可逆地从指定表中删除所有数据,并从该表派生的任何物化视图中删除所有数据。

语法:
TRUNCATE [TABLE] [keyspace_name.table_name]

在truncate表时需要以下操作:

1、如有必要,可使用cqlsh 一致性命令设置的一致性水平ALL。
2、使用nodetool status或其他工具确保所有节点都已启动并接收连接。
3、使用TRUNCATE或TRUNCATE TABLE,后跟表名。
例如:
TRUNCATE eo_im.test;或者
TRUNCATE TABLE eo_im.test;
注意: TRUNCATE向所有节点发送JMX命令,告诉他们删除保存指定表中数据的SSTable。如果这些节点中的任何节点已关闭或未响应,则该命令将失败并输出如下消息:
truncate cycling.user_activity;
Unable to complete request: one or more nodes were unavailable.

五、nodetool常用操作
nodetool status
查看集群状态

nodetool
参数:

short    long    description
-h    –host    hostname or ip address
-p    –port    端口号
-pwf    –password-file    密码文件路径
-pw    –password    密码
-u    –username    用户名
–    将选项与可能被误认为选项参数区分开    
示例:

root@bj-ali-std1-data_slave-03:/# nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens       Owns    Host ID                               Rack
UN  172.23.245.103  4.34 GiB   256          ?       49165d85-3681-4307-abd5-2b5a641a5702  rack1
UN  172.23.245.105  10.73 GiB  256          ?       899e0381-c3c7-4111-9439-7b8302be9fac  rack1
UN  172.23.245.104  8.42 GiB   256          ?       de72d74a-516a-4d9e-b46f-c27a2b6e6f81  rack1

说明:

status 节点运行状态:
U:up的缩写
D:down的缩写

state 集群状态:
N:normal(正常)的缩写
L:leaving(离开)的缩写
J:joining(加入)的缩写
M:moving(移动)的缩写

Owns:
每个数据中心节点拥有的数据百分比乘以复制因子。例如,节点可以拥有33%的环,但如果复制因子为3,则显示100%。
注意:如果群集使用具有不同复制策略或复制因子的键空间,请在运行nodetool status时指定键空间以获取有意义的本机信息。

nodetool snapshot
1、查看快照列表:

root@cassandra-2:~# nodetool listsnapshots


2、清除快照:

root@cassandra-2:~# nodetool clearsnapshot
Requested clearing snapshot(s) for [all keyspaces]
root@cassandra-2:~# nodetool listsnapshots
Snapshot Details:
There are no snapshots

3、创建快照:

语法:nodetool -h localhost -p 7199 snapshot

root@cassandra-2:~# nodetool snapshot xn_dolphin_1
Requested creating snapshot(s) for [xn_dolphin_1] with snapshot name [1539103181091] and options {skipFlush=false}
Snapshot directory: 1539103181091
root@cassandra-2:~# nodetool listsnapshots
Snapshot Details:
Snapshot name Keyspace name Column family name               True size Size on disk
1539103181091 xn_dolphin_1  dolphin_conversation_message     0 bytes   1.18 KiB
1539103181091 xn_dolphin_1  dolphin_conversation_member      0 bytes   1.02 KiB
1539103181091 xn_dolphin_1  dolphin_conversation_list        0 bytes   946 bytes
1539103181091 xn_dolphin_1  zoogate_blacklist                0 bytes   1.01 KiB
1539103181091 xn_dolphin_1  dolphin_conversation             0 bytes   1.1 KiB
1539103181091 xn_dolphin_1  dolphin_wchat_openid             0 bytes   895 bytes
1539103181091 xn_dolphin_1  dolphin_leaving_msg              0 bytes   1.27 KiB
1539103181091 xn_dolphin_1  dolphin_conversation_visitorinfo 0 bytes   1.2 KiB
1539103181091 xn_dolphin_1  dolphin_member_inout             0 bytes   1.05 KiB
1539103181091 xn_dolphin_1  zoogate_login_info               0 bytes   1.02 KiB
1539103181091 xn_dolphin_1  dolphin_conversation_result      5.1 MiB   5.1 MiB
1539103181091 xn_dolphin_1  dolphin_conversation_statistics  0 bytes   1 KiB

Total TrueDiskSpaceUsed: 5.1 MiB

4、恢复数据

nodetool flush
从memtable中刷新一个或多个表。

语法:
nodetool < options > flush - < keyspace >(< table > …)

选项

短    长    描述
-h    –host    主机名或IP地址
-p    –port    端口号。
-pwf    –password-file    密码文件路径。
-pw    –password    密码。    
-u        –username
keyspace    键空间的名称。    
table    一个或多个表名,用空格分隔。    
–    将选项与可能被误认为选项的参数分开。    
描述:

指定一个键空间,后跟一个或多个要从memtable刷新到磁盘上的SSTables的表。

nodetool repair
修复数据的一致性

在增加副本因子时,使用repair把保证数据副本个数满足需求。

nodetool cleanup
在减少副本因子时,使用cleanup 来清除多余的副本数据。

nodetool gossipinfo
集群的gossip信息

nodetool removenode
删除某个节点

nodetool removenode HostID//删除一个节点 例:./nodetool removenode ec1411fc-4ac9-473d-8374-f2fc293e6472
nodetool removenode status //查看删除状态
nodetool removenode force //如果用status发现总在等待一个节点, 行一次force停掉

nodetool removenode host_id

nodetool netstats
获取有关主机的网络信息。

nodetool reloadseeds
重新加载种子节点列表。

nodetool drain
将节点所有memtables数据刷新到SSTables硬盘。此操作会中断来自其他节点的监听,需要重启该节点。如果只是要讲memtables刷新到磁盘上,建议使用nodetool flush。一般在Cassandra版本升级的时候才使用这个命令。

nodetool tablestats eo_cs.eo_name
查看表的一些信息,包括读的次数,写的次数,sstable的数量,memtable信息,压缩信息,bloomfilter信息。

和nodetool cfstats一样

nodetool compactionstats
统计正在压缩的任务

nodetool enablebackup
启动增量备份

对应nodetool disablebackup

nodetool gcstats
打印垃圾收集(GC)统计信息。

nodetool ring
Provides node status and information about the ring.

[root@tidb1 ~]# nodetool ring


Datacenter: datacenter1
==========
Address    Rack        Status State   Load            Owns                Token                                       
                                                                          9217867712051363644                         
10.0.0.61  rack1       Up     Normal  321.02 KiB      ?                   -9218584694210041843                        
10.0.0.62  rack1       Up     Normal  330.48 KiB      ?                   -9217256112395284002                        
10.0.0.62  rack1       Up     Normal  330.48 KiB      ?                   -9210889157837833843                        
10.0.0.62  rack1       Up     Normal  330.48 KiB      ?                   -9171000296116146048                        
10.0.0.62  rack1       Up     Normal  330.48 KiB      ?                   -9152550881329104468                        
10.0.0.62  rack1       Up     Normal  330.48 KiB      ?                   -9105469006225184150                        
10.0.0.63  rack1       Up     Normal  310.56 KiB      ?                   -9101761092802475775                        
10.0.0.61  rack1       Up     Normal  321.02 KiB      ?                   -9038091519118775922                        
10.0.0.62  rack1       Up     Normal  330.48 KiB      ?                   -9030971017156121076                        
10.0.0.61  rack1       Up     Normal  321.02 KiB      ?                   -9026658576359436277                        
10.0.0.61  rack1       Up     Normal  321.02 KiB      ?                   -8988926568650120334    

nodetool statushandoff
Provides the status of hinted handoff.

[root@tidb1 ~]# nodetool statushandoff
Hinted handoff is running


六、Gossip通信协议
https://blog.csdn.net/q936889811/article/details/84101762

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值