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 |  |     SELECT
 cassandra | cassandra |    |     SELECT
 cassandra | cassandra |    |     SELECT
     eo_im |     eo_im |    |     SELECT
      eocs |      eocs |    |     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通信协议

链接

你可能感兴趣的:(cassandra)